c - Makefile:不确定如何使用变量制作一个好的 makefile

标签 c makefile

在我的项目中,我有一个项目目录和 4 个子目录:bin、inc、obj 和 src。所有源文件都在“src”中,所有头文件都在“inc”中。

我正在尝试制作一个 makefile 以将所有源代码编译成同名新扩展对象并放入“obj”目录,然后将它们全部链接到“bin”目录中的最终 project.out。这是我目前所拥有的:

       C_FILES = $(wildcard src/*.c)
       OBJ_FILES = $(addprefix obj/,$(notdir $(C_FILES:.cpp=.o)))
       LD_FLAGS = 
       CC_FLAGS = -MMD -c -Wall -lm
       BINARY = bin/project.out

       all: $(BINARY)
       $(BINARY): $(OBJ_FILES)
           gcc $(LD_FLAGS) -o $@ $<

       OBJ_FILES = $(patsubst $(C_FILES),$(OBJ_FILES),$(SOURCES))
          $(CC) $(CC_FLAGS) $< -o $@

       -include $(OBJ_FILES:.o=.d)

我收到“第 12 行缺少分隔符” 我是 makefile 的新手,所以我犯了哪些错误?我试过 GNU makefile 教程,但显然遗漏了一些东西。

最佳答案

你非常接近。

“缺少分隔符”错误意味着您在一行的开头使用了空格而不是文字制表符。不幸的是,Make 对此非常挑剔。在 vim 中,您可以按 CtrlVTab 来输入文字制表符。

除此之外,您只需进行两处更改即可让您的 Makefile 正常工作。这是 diff :

--- Makefile
+++ Makefile
@@ -1,4 +1,4 @@
-C_FILES = $(wildcard src/*.c)
+C_FILES = $(wildcard src/*.cpp)
 OBJ_FILES = $(addprefix obj/,$(notdir $(C_FILES:.cpp=.o)))
 LD_FLAGS = 
 CC_FLAGS = -MMD -c -Wall -lm
@@ -8,7 +8,7 @@
 $(BINARY): $(OBJ_FILES)
         gcc $(LD_FLAGS) -o $@ $<

-OBJ_FILES = $(patsubst $(C_FILES),$(OBJ_FILES),$(SOURCES))
+obj/%.o: src/%.cpp
         $(CC) $(CC_FLAGS) $< -o $@

 -include $(OBJ_FILES:.o=.d)

第一个变化是有时你引用.c文件,有时引用.cpp文件;你需要保持一致。

第二个变化是你需要为 Make 如何将 src/foo.cpp 文件转换为 obj/foo.o 文件指定一个规则,使用一个pattern rule .

这是更新后的 Makefile:

C_FILES = $(wildcard src/*.cpp)
OBJ_FILES = $(addprefix obj/,$(notdir $(C_FILES:.cpp=.o)))
LD_FLAGS = 
CC_FLAGS = -MMD -c -Wall -lm
BINARY = bin/project.out

all: $(BINARY)
$(BINARY): $(OBJ_FILES)
        gcc $(LD_FLAGS) -o $@ $<

obj/%.o: src/%.cpp
        $(CC) $(CC_FLAGS) $< -o $@

-include $(OBJ_FILES:.o=.d)

不幸的是,您不能只是复制并粘贴它并期望它能正常工作,因为 Tab 字符会被弄乱。您必须手动更改第 9 行和第 12 行的开头以使用文字制表符。

关于c - Makefile:不确定如何使用变量制作一个好的 makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22079485/

相关文章:

C 从命令提示符中获取参数作为条件

ios - 在 theos makefile 中找不到架构 arm64 的 AWSCore 框架

c - 在堆栈中查找最小值,时间复杂度为 O(1)

c - block 和循环之间到底有什么区别?

linux - "cannot find -lreadline"编译Lua错误

makefile - 在简单扩展的变量之前

makefile - 如果条件在Makefile中的目标内

C - Makefile 在头文件更改后编译,但更改不生效

在源中配置 clang-format

c - 当 2 个程序映射同一个文件时,mmap 如何工作