使用cmake从整个项目中创建一个静态库

Max*_*Max 7 linux cmake

c ++ - 项目,比方说,foo由cmake维护.一个人想要创建一个库libfoo.a(在整个源代码树中创建所有类/方法/函数),以便创建可以链接到库的程序-lfoo.

好的,让我们现在考虑一个玩具的例子,而且这个问题很清楚.目录foo(项目的根目录)包含目录a,和b.CmakeLists.txt创建了两个:

# a/CMakeLists.txt
add_library(A <a_sources>)
# b/CMakeLists.txt
add_library(B <b_sources>)
Run Code Online (Sandbox Code Playgroud)

一个CMakeLists.txt用于根目录:

add_subdirectory(a)
add_subdirectory(b)
add_library(foo <foo_sources>
target_link_libraries(foo A B)
Run Code Online (Sandbox Code Playgroud)

这对我是一个惊喜:建设libfoo.a包含foo_sources唯一方法后,和a_sources,b_sources被排除在外.在创建可执行文件cmake的"猜测"是:当可执行文件的建立是在同一个项目中的情况下确定ab如果它与必须链接foo.但是在可执行文件创建"外部"项目的情况下使用库foo必须链接-lfoo -la -lb,现在想象一个有很多子目录的项目 - 如何处理它?所以问题是"如何创建一个库,通过cmake的方式聚合整个项目的方法?"

谷歌搜索引导我到最近嵌入(出现在2.8.8)的OBJECT library机会.这里显示了使用它的好例子.现在上面的问题可以解决:

# a/CMakeLists.txt
add_library(A OBJECT <a_sources>)
# b/CMakeLists.txt
add_library(B OBJECT <b_sources>)
# foo/CMakeLists.txt
add_subdirectory(a)
add_subdirectory(b)
add_library(foo <foo_sources> $<TARGET_OBJECTS:A> $<TARGET_OBJECTS:B>)
Run Code Online (Sandbox Code Playgroud)

问题似乎解决了,不幸的是,并不完全.

例如,如果依赖链长于2,foo依赖于A,依赖于B,问题仍然存在.那是因为,

对象库可能只包含编译为目标文件的源(和标头).

无法导入,导出,安装或链接对象库.

(报价取自同一链接)

我试过的几种组合target_link_library(),add_library(), add_library(... OBJECT ..)试图链接A,并Bfoo没有成功(在cmake的进程的错误.)

我必须放松一些简单的东西,请帮忙,谢谢!我不确定它是否重要:项目是在linux上维护的.

Pet*_*ker 3

我认为你对“依赖”这个词感到困惑。如果您正在构建一个名为 的库,foo并且它有两个部分A和,则是否依赖B并不重要;该库应该包含两者。您显示的 CMake 代码将正确构建。ABfoo