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

File CMake:将为库构建的对象文件重用到另一个库目标中,file,object,static,cmake,File,Object,Static,Cmake,我正试图将我的项目转移到CMake,同时对编译过程进行一些优化 交易如下: 我有几个子目录,每个子目录都(必须)编译到一个静态库中(这是可行的) 我想将每个子目录中的所有对象文件收集到另一个更大、完整的静态库中 看起来是这样的: . libBig.a # made from object from subdir1 and subdir2 subdir1/ src/ libSubdir1.a subdir2/ src/ libSubdir2.a 今天,我设法使用了一

我正试图将我的项目转移到CMake,同时对编译过程进行一些优化

交易如下:

  • 我有几个子目录,每个子目录都(必须)编译到一个静态库中(这是可行的)
  • 我想将每个子目录中的所有对象文件收集到另一个更大、完整的静态库中
看起来是这样的:

.
libBig.a  # made from object from subdir1 and subdir2
subdir1/
   src/
   libSubdir1.a
subdir2/
   src/
   libSubdir2.a
今天,我设法使用了一个全局变量,其中每个subdir 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
不能合并两个静态库


您知道如何执行此操作吗?

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

您可以使用中引入的新对象库功能。这一思想已得到解释。基本上,对象库是一个类似于从自动工具到对象文件分组的概念


检查完整的CMake。

你打算从什么开始使用CMake?为什么?从手工制作的Makefiles开始!我希望它能够易于跨平台编译,易于与IDE集成,我想:为什么不呢?这是我最后做的,但我仍然对结果不满意,因为现在我的CMAKEL列表看起来臃肿,达到了相同的l数量比我原来的Makefile更重要的是,可能是为了将来的CMake版本。你有没有尝试过使用libtool便利库来实现automake?或者你已经厌倦了在这一点上玩弄构建系统;-)?如果您从一个顶级非递归的
Makefile.am
驱动整个程序,您甚至可能不需要方便的libs。我也遇到了同样的问题,并尝试了对象库,它非常有用。非常感谢。