提问人:Gui13 提问时间:2/23/2011 更新时间:10/11/2018 访问量:16668
CMake:将针对一个库构建的目标文件重用到另一个库目标中
CMake: reuse object files built for a lib into another lib target
问:
我正在尝试将我的项目移动到 CMake,同时对编译过程进行一些优化。
这是交易:
- 我有几个子目录,每个子目录都(必须)编译成一个静态库(这有效)。
- 我想将每个子目录中的所有目标文件收集到另一个更大、更完整的静态库中。
它看起来像这样:
.
libBig.a # made from object from subdir1 and subdir2
subdir1/
src/
libSubdir1.a
subdir2/
src/
libSubdir2.a
今天,我设法使用了一个全局变量,其中每个子目录 CMakeLists.txt 都将附加自己的源文件。我在我的大库中使用这个变量作为“源”输入:
# the big library depends on all the source files
# ${all_src} is automatically filled with each subdir's cpp file
get_property( BigLib_src GLOBAL PROPERTY all_src)
add_library( Big STATIC ${BigLib_src}) # recompiles all the sources
现在,这工作得不错,还不错,但问题是,我所有的源文件都会被编译两次:一次用于 subdir 库,一次用于大库。
CMake 似乎忘记了它已经构建了它们。
我必须保留 subdir 库,并且无法合并两个静态库。ar
你知道怎么做吗?
答:
3赞
Jack Kelly
2/24/2011
#1
从 CMake 2.8.8 开始,您可以使用库类型执行此操作。参见 mloksot 的答案。旧的情况是,每个目标都有自己的目录,CMake 将为每个目标构建每个依赖对象。这样可以防止一个源文件可以多次使用不同的 .(请注意,默认情况下,CMake 在这里比 automake 更保守:只有当目标使用不同的目标构建时,automake 才会停止为不同的目标重用目标文件(也可能是)。OBJECT
CFLAGS
CFLAGS
CPPFLAGS
评论
0赞
Gui13
3/8/2011
这就是我最后所做的,但我仍然对结果不满意,因为现在我的 CMakeLists 看起来很臃肿,并且达到了与我原来的 Makefile 相同的行数......也许用于 CMake 的未来版本。
0赞
Jack Kelly
3/8/2011
你有没有试过,用libtool便利库?或者你现在已经厌倦了摆弄构建系统;-)?如果您从一个顶级非递归驱动整个事情,您甚至可能不需要便利库。automake
Makefile.am
33赞
mloskot
5/17/2012
#2
您可以使用 CMake 2.8.8 中引入的新 OBJECT 库功能。这里解释了这个想法。基本上,OBJECT 库与 Autotools 中已知的用于对对象文件进行分组的便利库的概念类似。
查看完整的 CMake OBJECT 库教程。
评论
2赞
Baptiste Wicht
6/25/2012
我遇到了同样的问题并尝试了 OBJECT 库,它就像一个魅力。谢谢
下一个:重用具有少量变化的视图组
评论