在我的项目中,我有一个项目目录和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行丢失分隔符” 我是makefiles的新手,所以我犯的错误是什么?我已经尝试过GNU makefile教程,我显然错过了一些东西。
答案 0 :(得分:3)
你非常接近。
“缺少分隔符”错误意味着您在行的开头使用了空格而不是文字制表符。不幸的是,Make非常挑剔。在vim中,您可以按 Ctrl V , 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
个文件;你需要保持一致。
第二个更改是,您需要使用pattern rule指定Make如何将src/foo.cpp
文件转换为obj/foo.o
文件的规则。
这是更新后的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行的开头以包含文字制表符。