CMake:将为lib构建的对象文件重用到另一个lib目标中

时间:2011-02-23 13:32:32

标签: file object static cmake

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

现在,这可行,但不是太糟糕,但事实是,我的所有源文件都被编译了两次:一次用于子库,一次用于大型库。

CMake似乎忘记了它已经构建了它们。

来保留子文件库,ar无法合并两个静态库。

你知道怎么做吗?

2 个答案:

答案 0 :(得分:28)

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

检查完整的CMake OBJECT library tutorial

答案 1 :(得分:3)

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