请求makefile编写技巧

时间:2013-11-23 13:55:17

标签: linux bash gcc makefile

build: source1.c source2.c header.h lib.so
        gcc source1.c source2.c -shared lib.so -o exec.bin
exec.bin: source1.o source.o
source1.o: source1.c
        gcc source1.c -c -o source1.o
source2.o: source2.c
        gcc source2.c -c -o source2.o
clean:
        rm exec.bin source1.o source2.o

我有一些指令要使这个Makefile依赖于那4个源文件来编译程序(程序上下文无关紧要)。 它还必须创建目标文件并仅在进行修改时进行编译。 上面的代码是我设法写的。我是新手,我似乎无法找出问题所在。

2 个答案:

答案 0 :(得分:2)

通常,您的先决条件搞砸了。您想要声明需要它们的目标的先决条件。您还希望每个配方都能准确构建您在makefile中编写的目标。

例如,您有一个目标为build的规则,但它会创建一个名为exec.bin的输出文件。那不对:如果食谱创建了一个名为exec.bin的文件,那么目标应该命名为exec.bin。如果你想要像build这样的假装规则那么你应该声明它是虚假的。

此外,您有header.h作为build的先决条件。即使不考虑目标名称,当头文件发生变化时,您是否重新链接对象?不是直接的。您在头文件更改时重新编译源文件。因此头文件应该是目标文件的先决条件,而不是可执行文件。

最后,如果您利用内置规则,您的生活会更加简单。您可以像这样重写您的makefile:

CC  = gcc
SRC = source1.c source2.c
LIB = lib.so

OBJ = $(SRC:%.c=%.o)

.PHONY: build
build: exec.bin

exec.bin: $(OBJ)
        $(CC) $(OBJ) $(LIB) -o $@

$(OBJ): header.h

clean:
       rm -f exec.bin $(OBJ)

我们没有定义如何从源文件构建目标文件的规则,因为make已经有内置规则可以为我们做这些。

ETA:

如果您无法使用内置规则,请创建自己的模式规则。例如:

XOBJ = $(SRC:%.c=%.xo)

%.xo : %.c
        <whatever command>

$(XOBJ): header.h

答案 1 :(得分:0)

以下是编写新Makefile的提示:不要这样做。有更好的工具可用。例如,CMake是一个非常有用的工具,可以用更清晰的语言生成Makefile(遗憾的是不是像Python这样的标准语言,但是它非常好)。

CMake将自动生成“干净”和“帮助”以及其他目标,以及您还不知道所需的更多功能(如优化版本)。

这是让你入门的东西(将此文件命名为CMakeLists.txt):

add_library(foo SHARED source1.c source2.c)
add_executable(exec source3.c)
target_link_libraries(exec foo)