我正在尝试将项目移至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
无法合并两个静态库。
你知道怎么做吗?
答案 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
)。