通用Makefile

时间:2014-11-24 16:22:38

标签: c++ linux makefile

我正在寻找一个通用的makefile,它将构建当前目录和所有子目录中的所有C ++文件(例如,源代码,测试文件,gtest等)

我花了几个小时尝试了几个,最后从make file with source subdirectories确定了解决方案。

我需要对它进行三处更改:

  1. Gtest使用* .cc作为其C ++文件,而其他人使用* .cpp
  2. 我需要能够定义多个搜索路径。
  3. 添加编译器标志,例如-W all
  4. 我设法打破了makefile,如下所示,这样运行make就会给我

      

    make:***没有规则来制作目标%.cpp=%.o', needed by myProgram'。   停止。

    我怎样才能做到这三件事?

    # Recursively get all *.cpp in this directory and any sub-directories
    SRC = $(shell find . -name *.cc) $(shell find . -name *.cpp)
    
    INCLUDE_PATHS = -I ../../../ -I gtest -I dummies
    
    #This tells Make that somewhere below, you are going to convert all your source into 
    #objects
    # OBJ =  src/main.o src/folder1/func1.o src/folder1/func2.o src/folder2/func3.o
    
    OBJ = $(SRC:%.cc=%.o %.cpp=%.o)
    
    #Tells make your binary is called artifact_name_here and it should be in bin/
    BIN = myProgram
    
    # all is the target (you would run make all from the command line). 'all' is dependent
    # on $(BIN)
    all: $(BIN)
    
    #$(BIN) is dependent on objects
    $(BIN): $(OBJ)
        g++ 
    
    #each object file is dependent on its source file, and whenever make needs to create
    # an object file, to follow this rule:
    %.o: %.cc
        g++ -c $(INCLUDE_PATHS) $< -o $@
    

    [更新]感谢您的帮助到目前为止。为了解决一些注释,我无法控制混合* .cc和* .cpp fiel扩展,我可以说目录树中不会有源文件,我不希望包含在构建中。

    我仍然遇到SRC问题,因为没有找到输入文件。我想我应该更多地查看find命令,因为我使用Linux已经有一段时间了。

2 个答案:

答案 0 :(得分:1)

Etan指出了你的问题。但是您不必执行两次替换,只需:

OBJ := $(addsuffix .o,$(basename $(SRCS)))

并且,在使用:=函数时,您应始终使用=而不是shell进行分配。

答案 1 :(得分:1)

这是一个相当差的makefile:它不会为你构建标头依赖项,所以你很可能最终会遇到损坏的构建。

我无耻地推荐this one