Makefile:不确定如何使用变量创建一个好的makefile

时间:2014-02-27 20:21:26

标签: 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行丢失分隔符” 我是makefiles的新手,所以我犯的错误是什么?我已经尝试过GNU makefile教程,我显然错过了一些东西。

1 个答案:

答案 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行的开头以包含文字制表符。