【问题标题】:CMake: reuse object files built for a lib into another lib targetCMake:重用为一个库构建的目标文件到另一个库目标
【发布时间】:2011-02-23 13:32:32
【问题描述】:

我正在尝试将我的项目迁移到 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 似乎忘记了它已经构建了它们。

保留子目录库,ar 不能合并两个静态库。

你知道怎么做吗?

【问题讨论】:

  • 你是从什么迁移到 CMake 的?为什么?
  • 来自手工制作的 Makefile!我希望它易于跨平台编译,易于与 IDE 集成,我想:为什么不呢?

标签: file object static cmake


【解决方案1】:

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

检查完整的 CMake OBJECT library tutorial

【讨论】:

  • 我遇到了同样的问题并尝试了 OBJECT 库,它就像一个魅力。谢谢
【解决方案2】:

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

【讨论】:

  • 这就是我最终所做的,但我仍然对结果不满意,因为现在我的 CMakeLists 看起来很臃肿,并且达到了与我原来的 Makefile 相同的行数......也许未来的版本的 CMake。
  • 你试过automake,用libtool便利库吗?或者你现在厌倦了使用构建系统;-)?如果你从一个顶级非递归 Makefile.am 驱动整个东西,你甚至可能不需要便利库。
猜你喜欢
  • 2016-08-16
  • 1970-01-01
  • 2019-09-05
  • 1970-01-01
  • 2019-08-17
  • 2015-10-06
  • 2022-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多