我正在寻找一个通用的makefile,它将构建当前目录和所有子目录中的所有C ++文件(例如,源代码,测试文件,gtest等)
我花了几个小时尝试了几个,最后从make file with source subdirectories确定了解决方案。
我需要对它进行三处更改:
我设法打破了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已经有一段时间了。
答案 0 :(得分:1)
Etan指出了你的问题。但是您不必执行两次替换,只需:
OBJ := $(addsuffix .o,$(basename $(SRCS)))
并且,在使用:=
函数时,您应始终使用=
而不是shell
进行分配。
答案 1 :(得分:1)
这是一个相当差的makefile:它不会为你构建标头依赖项,所以你很可能最终会遇到损坏的构建。
我无耻地推荐this one。