如何拥有带有子文件夹的通用生成文件
How to have a generic make file with subfolders?
当然,这个问题已经被问了很多次了,但我找不到正确的答案,所以我在问。
我有以下项目结构:
/root
| obj
| Makefile
| src/
| | dir1/
| | | 1.cpp
| | dir2/
| | | 2.cpp
| | | dir3/
| | | | 3.cpp
| | | | 4.cpp
| | main.cpp
我是否可以有一个通用的makefile来编译具有src文件夹任何深度的任何子文件夹中的所有cpp文件,并将目标文件生成到obj目录中?
注意 这个项目是使用 Eclipse CDT 开发的,我希望现在能够提供源代码,而无需用户安装 Eclipse 来构建它。
要实现"无限"递归,可以使用具有扩展模式的通配符:
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')
好吧,我不打算回答这个问题(这个答案本身不是关于make
),但是:
-
OP表示,他不是专门针对
make
,只是最简单的解决方案。 -
目前还没有针对
make
的答案。
所以,这是如何在cmake
和SCons
中做到这一点。请注意我的目的不是贬低make
,提倡以下两个中的任何一个(不过,我必须说 - 我的印象是当今构建系统的两种主流C++)等。
清明
在 CMake 基础教程中,您将使用如下所示的内容:
file(GLOB_RECURSE variable [RELATIVE path]
[FOLLOW_SYMLINKS] [globbing expressions]...)
(有关详细信息,请参阅此问题。
斯康斯
在 Scons 基本教程中,您将使用如下内容:
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
(有关详细信息,请参阅此问题。
相关文章:
- 如何将更多文件夹添加到c++include路径
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 如何在文档文件夹中创建目录
- "assimp/config.h"找不到,但它在文件夹中
- C++入门 5 版:类消息和文件夹
- 我可以在 Arduino 的库文件夹之外安装库吗?
- 如何按文件扩展名引用文件夹中的文件
- 在QTreeView中仅显示共享驱动器和文件夹
- 加载与引用 .NET DLL 位于同一文件夹中的引用的 .NET DLL 时"Not found"异常
- 介子复制/安装头文件到输出目录并保持文件夹结构
- vcruntime.h 从 Windows 包含文件夹中丢失?
- 在文件夹迭代上实现 RAII
- 使用 Powershell 命令将 cpp 文件的文件夹编译为 GNU 的 g++
- 使文件夹中的所有文件可供所有项目(子目录)访问
- 无法使用 CMake 从其他文件夹添加源文件
- 如何在安卓工作室中将c ++头文件从一个文件夹导入到另一个文件夹?
- 对单元测试(googletest)和项目/文件夹/文件的混淆
- 设计文件夹/文件系统