CMake:将针对一个库构建的目标文件重用到另一个库目标中

CMake: reuse object files built for a lib into another lib target

提问人:Gui13 提问时间:2/23/2011 更新时间:10/11/2018 访问量:16668

问:

我正在尝试将我的项目移动到 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

你知道怎么做吗?

File 对象 静态 CMake

评论

0赞 Jack Kelly 2/24/2011
无论如何,您要从什么迁移到 CMake?为什么?
4赞 Gui13 2/24/2011
来自手工制作的 Makefiles!我希望它易于跨平台编译,易于与 IDE 集成,我想:为什么不呢?

答:

3赞 Jack Kelly 2/24/2011 #1

从 CMake 2.8.8 开始,您可以使用库类型执行此操作。参见 mloksot 的答案。旧的情况是,每个目标都有自己的目录,CMake 将为每个目标构建每个依赖对象。这样可以防止一个源文件可以多次使用不同的 .(请注意,默认情况下,CMake 在这里比 automake 更保守:只有当目标使用不同的目标构建时,automake 才会停止为不同的目标重用目标文件(也可能是)。OBJECTCFLAGSCFLAGSCPPFLAGS

评论

0赞 Gui13 3/8/2011
这就是我最后所做的,但我仍然对结果不满意,因为现在我的 CMakeLists 看起来很臃肿,并且达到了与我原来的 Makefile 相同的行数......也许用于 CMake 的未来版本。
0赞 Jack Kelly 3/8/2011
你有没有试过,用libtool便利库?或者你现在已经厌倦了摆弄构建系统;-)?如果您从一个顶级非递归驱动整个事情,您甚至可能不需要便利库。automakeMakefile.am
33赞 mloskot 5/17/2012 #2

您可以使用 CMake 2.8.8 中引入的新 OBJECT 库功能。这里解释了这个想法。基本上,OBJECT 库与 Autotools 中已知的用于对对象文件进行分组的便利库的概念类似。

查看完整的 CMake OBJECT 库教程

评论

2赞 Baptiste Wicht 6/25/2012
我遇到了同样的问题并尝试了 OBJECT 库,它就像一个魅力。谢谢