【问题标题】:What would be the minimal Makefile for a C project?C 项目的最小 Makefile 是什么?
【发布时间】:2017-06-26 08:56:15
【问题描述】:

我发现很多答案,例如 this one,它们不使用隐式规则。

我能写的最低限度是这样的:

SRC = $(wildcard *.c)
OBJ = $(patsubst %.c, %.o, $(SRC))

EXEC=a.exe

all: $(EXEC)

$(EXEC): $(OBJ)
    $(CC) $^ -o $@

clean:
    $(RM) $(OBJ)
    $(RM) $(EXEC)

但我确信我也可以删除链接部分。

这个 Makefile 可以再减少一点吗?

编辑

Maxim Egorushkin的帮助下,我写了这个:

#Makefile
OBJS=$(patsubst %.c,%.o,$(wildcard *.c))

EXEC=a

$(EXEC): $(OBJS)

all : $(EXEC)

clean :
    rm -f $(OBJS)

.PHONY: all clean

它确实构建了我的文件,但它没有链接任何东西:

$ make
cc    -c -o bar.o bar.c
cc    -c -o cow.o cow.c
cc    -c -o foo.o foo.c

我应该改变什么?

虚拟源文件的创建如下:

echo "int main() {return 0;}" > cow.c
touch foo.c bar.c cow.c

【问题讨论】:

  • 最小的 makefile 是空的,只使用预定义的规则。

标签: makefile


【解决方案1】:

最低限度是:

all : a

a : a.o b.o c.o

clean :
    rm -f a a.o

.PHONY: all clean

它期望源文件a.cb.cc.c 生成可执行的a

$ touch a.c b.c c.c

$ make
cc    -c -o a.o a.c
cc    -c -o b.o b.c
cc    -c -o c.o c.c
cc   a.o b.o c.o   -o a
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
<builtin>: recipe for target 'a' failed
make: *** [a] Error 1

但是,您不会使用built-in GNU make rules 自动生成标头依赖项。 Extra 5 lines would be required for that.

【讨论】:

  • 您删除了干净目标中的a.c,并且没有使用$(RM) 变量
  • 在我的例子中我得到No rule to make target 'a', needed by 'all'
  • @nowox 我测试了代码并且它工作正常。你如何调用make
  • 它可以工作,因为您不需要链接您的对象。在我的示例中,我有几个 C 文件。
  • @nowox 在这种情况下,只需添加一个依赖项:a: a.o several.o c.o files.o。我的帖子的第一个链接中对此进行了解释。
猜你喜欢
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 2020-12-15
  • 2015-07-05
  • 2018-12-15
  • 1970-01-01
相关资源
最近更新 更多