如何编写智能makefile?

时间:2014-04-24 15:05:02

标签: c++ makefile

我是linux的新手,也是makefile的新手,所以我在这一点上有点难过。我现在一直盯着制作手册一小时,我想我会问:

我想为一个相对较小的项目创建一个makefile,其源文件位于proj/src/,并且位于该位置的子目录中。我在proj/makefile编写了一个makefile,并希望用它来收集所有源文件,找到它们的依赖项,并将结果编译成proj/build/。这是我写的:

# here are my files and directories (there are also header files that are not
# listed here, but these are referred to from within the .cpp files with
# respect to the proj/src directory)
# proj/makefile
# proj/src/
# proj/src/main.cpp
# proj/src/dir1/
# proj/src/dir1/source1.cpp
# proj/src/dir2/
# proj/src/dir2/source2.cpp
# proj/build/

srcDir = src/
buildDir = build/

# This is a list of all the object files (can I get this programatically?)
objects = main.o source1.o source2.o

all: prog

# Here I want to compile all source (.cpp) files from src/ and all of its subdirectories, and to find the dependencies I want to call g++ -MM to automatically generate the list:
%.o: %.cpp
        $(CXX) $(CXXFLAGS) -MM -I $(srcDir)

clean:
                rm -rf *o $(buildDir)/prog

这远非功能性但我想在问之前先给它。运行此命令

  

制作: * 没有规则可以制作目标main.o', needed by编辑'。停止。

所以大概我尝试自动编写目标文件失败了。如果有人可以给我一些很棒的方向,我希望在评论和代码之间你可以明白这个意图。

编辑:我现在尝试了以下内容:

SHELL := /bin/bash                                                              
srcDir = src                                                                    
buildDir = bin                                                                  
sources := $(shell find $(srcDir) -name *.cpp)                                  
objects := $(sources:%.cpp=%.o)                                                 

-include $(sources:%.cpp=%.d)                                                   

# This is a list of all the object files (can I get this programatically?)      
all: prog                                                                       

prog:   $(objects)                                                              
    g++ $(objects) -o $(buildDir)/prog                                          

# Here I want to compile all source (.cpp) files from src/ and all of its subdirectories, and to find the dependencies I want to call g++ -MM to automatically generate the list:
%.o: %.cpp                                                                      
    $(CXX) $(CXXFLAGS) -MMD -MP -c -I $(srcDir)                                    

clean:                                                                          
    rm -rf *o $(buildDir)/hello    

但是当我运行这个时,我收到以下错误:

g++  -MMD -MP -I src
g++: fatal error: no input files
compilation terminated.
make: *** [src/core/Cell.o] Error 1

1 个答案:

答案 0 :(得分:2)

它希望从main.o构建main.cpp,但顶层没有main.cpp。您可以指定目标文件的完整路径,如果它们与源文件一起构建:

objects = $(srcDir)/main.o $(srcDir)/dir1/source1.o $(srcDir)/dir2/source2.o
  

我能以编程方式得到这个吗?

我使用gnumake' shell函数

SHELL := /bin/bash
sources := $(shell find $(srcDir) -name *.cpp)
objects := $(sources:%.cpp=%.o)
  

找到我想调用g ++ -MM以自动生成列表的依赖项

使用-MMD生成依赖项文件以及编译。在此处指定-MP也是一个好主意 - 这可以确保在删除标头时正确更新依赖关系。给定上面定义的变量,您可以使用

包含依赖项文件
-include $(sources:%.cpp=%.d)