如何将来自不同目录的cpp文件编译到一个文件夹中
How to get cpp files from different directories compiled into one folder?
我有许多C++文件分布在几个文件夹中。
a_library/
file1.cpp
file2.cpp
category1/
file3.cpp
file4.cpp
他们被保证以唯一的名字命名。我想编译所有这些C++文件以分离obj/
目录中的对象文件。
我有一个带有相对路径的所有源文件的列表,以及它们相应的目标名称。
a_library/file1.cpp
a_library/file2.cpp
a_library/category1/file3.cpp
a_library/category1/file4.cpp
obj/file1.obj
obj/file2.obj
obj/file3.obj
obj/file4.obj
我如何制定一个规则,将第一个列表中的C++文件转换为第二个列表的对象文件?
这些尝试不起作用:
obj/%.obj: %:cpp
# ...
%.obj: %.cpp
# ...
.cpp.obj:
# ...
我不想写这样的规则:
obj/%.obj: a_library/%.cpp
# ...
obj/%.obj: a_library/category1/%.cpp
# ...
尝试设置VPATH
:
VPATH = a_library:a_library/category1
obj/%.o: %.cpp
$(CXX) -c $(CPPFLAGS) $(CFLAGS) $(CXXFLAGS) -o $@ $<
并添加完整的文件列表(我建议您明确列出文件,不要使用$(wildcard ...)
功能)和应用程序的链接:
files := main.cpp $(wildcard a_library/*.cpp) a_library/category1/file.cpp
obj/application: $(patsubst %.cpp,obj/%.o,$(notdir $(files)))
$(CXX) $(CFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ $+
$(wildcard)
有一个令人讨厌的倾向,就是在目录中拾取任何东西,比如一次性测试文件或临时文件(如果它们恰好有一个合适的名称:~file.cpp
)。
我能想到的一个解决方案是:用一个简单的规则就地构建它们,然后进行"收集阶段",将".o"文件移动到一个文件夹中。
制作一个"collect_objs"目标,它取决于你的$(objs),然后你的"main"目标必须取决于"collect_objs"。
可以使用shell 进行遍历
dirs := $(shell find ./ -type d)
collect_objs: $(dirs)
for d in $+; do
mv *.o YourDestDir/*.o
done
当然,这意味着使用UnxUtils包(带有"find"answers"mv")或Cygwin,因为您在Windows上。
另一种选择是使用某种工具显式地为每个.c/.cpp文件生成目标。抓取python,遍历源目录,并为每个.c/.cpp文件编写
obj/file_name.o:
gcc -c path/fo/file_name.c -o obj/file_name.o
使用cmake为您进行构建配置。
不久前,我在github上建立了一个简单的示例项目。
标准方法是在每个文件夹中都有一个Makefile
,并使用include
递归调用
这是我在10^100:上的前两次点击
http://owen.sj.ca.us/~rk/howto/slides/make/sslides/makerrecurs.html
http://www.gnu.org/savannah-checkouts/gnu/make/manual/html_node/Recursion.html
与这个问题没有严格的关系,因为它与Make无关,尽管我想展示我如何在3年后编译我的项目。Crafter是一个基于Python的元构建系统,它鼓励间接的树外构建(例如工作树中的build
)。构建对象文件和对静态库进行封顶与一样简单
# craftr_module(my_project)
from craftr import *
from craftr.ext.platform import cxx, ar
objects = cxx.compile(
sources = path.platform('**/*.cpp'),
)
lib = ar.staticlib(
output = 'myproj',
inputs = [objects],
)
运行craftr -eb
将产生以下构建产品的结构
Craftfile
file1.c
file2.c
category1/
file3.c
file4.c
build/
my_project/
obj/
file1.o
file2.o
category1/
file3.o
file4.o
libmyproj.a
- 使用 MEX 编译C++文件
- 获取 clang++:错误:在编译文件系统库的代码时
- 如何交叉编译C++文件
- 使用 MinGW 在 Windows 上的命令行编译C++文件
- 选择特定版本的 Visual Studio 命令行工具包,并根据特定版本的C++运行时环境编译文件
- 解析模板和范围后获取编译文件?
- 我的 PowerShell 脚本无法按预期工作(用于编译C++文件)
- 如何在不制作Visual Studio 2017项目的情况下编译C++文件?
- 'void *' 'void (*) (bool)' 指针使用 c ++ 编译器在 C 中编译文件的错误
- 在没有节点GYP的目标平台上编译C/C 文件
- 生成文件似乎以错误的顺序编译文件
- 编译 C++ 文件失败,因为找不到"ssize_t"的定义
- NeatBeans Makefile:麻烦编译.H文件
- 我无法编译文件系统库
- 在不使用预编译头C++项目中编译 C 文件
- 无法使用 Xcode 和终端在 Mac OS 上使用 OpenGL 库编译 c++ 文件
- 获取编译文件的列表,并由Make Project包含
- MinGW .h 编译文件不起作用:此文件的版本与您运行的 Windows 版本不兼容
- 编译 c++ 文件时出错:未定义的符号
- C++编译文件