可以肯定的是,这个问题已经被多次询问过了,但我找不到合适的答案,所以我要问。
我有以下项目结构:
/root
| obj
| Makefile
| src/
| | dir1/
| | | 1.cpp
| | dir2/
| | | 2.cpp
| | | dir3/
| | | | 3.cpp
| | | | 4.cpp
| | main.cpp
我是否可以使用一个通用的makefile来编译任何子文件夹中的所有cpp文件,其中任何深度的src文件夹和都会将对象文件生成到obj目录中?
注意这个项目是使用Eclipse CDT开发的,我现在希望能够提供源代码而无需用户安装Eclipse来构建它
答案 0 :(得分:3)
实现无限制的'递归,您可以使用带扩展模式的通配符:
CPPFILES := $(wildcard src/**/*.cpp)
然后您可以将它们转换为.o
文件列表:
OBJFILES := $(patsubst src/%.cpp,obj/%.o,$(CPPFILES))
现在我们有了构建目标:
.PHONY: all
all: $(OBJFILES)
编制规则:
obj/%.o: src/%.cpp
mkdir -p "$(@D)"
$(CC) -c $< -o $@
如果带有扩展模式的通配符不起作用,则可以使用:
CPPFILES := $(shell find src -name '*.cpp')
答案 1 :(得分:2)
好吧,我不打算回答这个问题(这个答案本身并不是make
),但是:
OP表示他并没有专门针对make
,只是最简单的解决方案。
目前还没有make
具体答案。
所以,这是如何在cmake
和SCons
中完成的。 请注意我的目的不是贬低make
,提倡以下两种方式(但是,我必须说 - 我认为这是两个主流的C ++构建系统今天)等等。
<强> CMake的强>
在CMake basic tutorial中,您可以使用以下内容:
file(GLOB_RECURSE variable [RELATIVE path]
[FOLLOW_SYMLINKS] [globbing expressions]...)
(有关详细信息,请参阅this question。)
<强>使用SCons 强>
在Scons basic tutorial中,您可以使用以下内容:
def getSubdirs(abs_path_dir):
lst = [ name for name in os.listdir(abs_path_dir) if os.path.isdir(os.path.join(abs_path_dir, name)) and name[0] != '.' ]
lst.sort()
return lst
(有关详细信息,请参阅this question。)