【问题标题】:Makefile : Automatically compile all c files, keeping .o files in separate folderMakefile : 自动编译所有 c 文件,将 .o 文件保存在单独的文件夹中
【发布时间】:2017-03-30 00:30:08
【问题描述】:

我拥有的是一个包含 3 个子目录的目录。 src/ 用于 .c 和 .h 文件,bin/ 是编译后的可执行文件应该去的地方,而 obj/ 是我想要 .obj 文件去的地方。

现在我希望 makefile 编译来自 src 的每个 .c 文件(我不必在 makefile 中将它们全部列出)并将 .o 文件放入 obj 中,并将从 foo.c 构建的可执行文件保存为 bin/foo。

有人可以帮帮我吗?每当我使用通配符时,都会抱怨规则不存在,当我使用隐式规则时,它不会将目标文件放在单独的文件夹中。

【问题讨论】:

    标签: c makefile gnu-make


    【解决方案1】:

    foo.c 本地构建foo.o

    foo.o: foo.c
        $(CC) -c $< -o $@
    

    做同样的事情,但在src/中使用任何需要的头文件:

    SRC := src
    
    foo.o: foo.c
        $(CC) -I$(SRC) -c $< -o $@
    

    做同样的事情,但使用src/中的源文件:

    SRC := src
    
    foo.o: $(SRC)/foo.c
        $(CC) -I$(SRC) -c $< -o $@
    

    要做到这一点,但将目标文件放在obj/

    SRC := src
    OBJ := obj
    
    $(OBJ)/foo.o: $(SRC)/foo.c
        $(CC) -I$(SRC) -c $< -o $@
    

    适用于任何此类对象文件(obj/foo.oobj/bar.o、...)的模式规则:

    SRC := src
    OBJ := obj
    
    $(OBJ)/%.o: $(SRC)/%.c
        $(CC) -I$(SRC) -c $< -o $@
    

    创建所需对象的列表:

    SOURCES := $(wildcard $(SRC)/*.c)
    OBJECTS := $(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SOURCES))
    

    还有一条涵盖所有内容的规则:

    all: $(OBJECTS)
    

    把它们放在一起:

    SRC := src
    OBJ := obj
    
    SOURCES := $(wildcard $(SRC)/*.c)
    OBJECTS := $(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SOURCES))
    
    all: $(OBJECTS)
        $(CC) $^ -o $@
    
    $(OBJ)/%.o: $(SRC)/%.c
        $(CC) -I$(SRC) -c $< -o $@
    

    请注意,这有一个很大的缺点: 是不跟踪对头文件的依赖关系。这可以自动完成,但这是一个微妙的技巧。它可以等到你掌握了这么多。

    【讨论】:

    • 感谢您的精彩回答。最后一个 sn-p 实际上不会构建可执行文件,但添加它没问题,所有文件都在我希望它们所在的位置:)
    • 按照我的想法,最后一个模式规则可能看起来更好。
    • @bobbogo:我同意,但我只是为了简单起见。
    • 我在哪里可以得到“微妙的技巧”......我准备好了,主人
    • @activedecay:看看Mad Scientist's excellent paper。并且请学会使用标点符号和大写字母。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    相关资源
    最近更新 更多