[英][MAKEFILE]: How to copy cpp source files from different source folders into one destination folder and use those cpp files to build using MAKE
[英]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/
目录中的Object文件。
我有一个包含相对路径的所有源文件的列表,以及它们对应的目标名称。
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”文件移动到单个文件夹中。
制作一个取决于你的$(OBJS)的“collect_objs”目标,然后你的“主”目标必须依赖于“collect_objs”。
遍历可以使用shell完成
dirs := $(shell find ./ -type d)
collect_objs: $(dirs)
for d in $+; do \
mv *.o YourDestDir/*.o
done
当然,这意味着使用UnxUtils包(带有'find'和'mv')或Cygwin,因为你在Windows上。
另一种选择是使用某种工具显式生成每个.c / .cpp文件的目标。 抓取python,遍历源目录并为每个.c / .cpp文件写入
obj/file_name.o:
gcc -c path/fo/file_name.c -o obj/file_name.o
标准方法是在每个文件夹中都有一个Makefile
,并使用include
递归调用
这是我在10 ^ 100上的第一次两次点击:
http://owen.sj.ca.us/~rk/howto/slides/make/slides/makerecurs.html
http://www.gnu.org/savannah-checkouts/gnu/make/manual/html_node/Recursion.html
与此问题并不严格相关,因为它与Make无关,但我想展示我如何在3年后编译我的项目。 Craftr是一个基于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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.