在我的项目中,我有一个项目目录和 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 中,您可以按 CtrlV、Tab 来输入文字制表符。
除此之外,您只需进行两处更改即可让您的 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/