我正在构建一些小组件作为主应用程序的共享库。让我们使用liba
和libb
的示例。每个都在它们自己的子目录中构建,如下所示:
add_library(liba SHARED a.cpp)
然后,在根项目文件夹中,我需要将我的主应用程序链接到两者。
include_directories(a)
include_directories(b)
add_executable(dummy dummy.cpp)
target_link_libraries(dummy a b)
CMake运行正常,我的应用程序编译但无法链接。问题是b引用了a。如果我在链接时提供库的顺序为
target_link_libraries(dummy b a)
该程序编译并链接正常
当这种系统开始涉及更复杂的库之间的依赖关系时,即使依赖关系是非循环的,它也开始变得不可能。如何在此管理链接步骤?在CMake中订购库以进行链接是否有技巧?
答案 0 :(得分:27)
您可以通过添加
指定a
和b
之间的关系
target_link_libraries(b a)
来自docs:
默认情况下,库依赖项是可传递的。当此目标链接到另一个目标时,链接到此目标的库也将显示在另一个目标的链接行上。
因此,如果您以这种方式将a
指定为b
的依赖关系,则甚至不需要在依赖于{{1}的任何目标中明确列出a
},即您的其他命令可以只是:
b
虽然它也不会对列出target_link_libraries(dummy b)
造成任何伤害。
答案 1 :(得分:11)
一个简单的解决方案(特别是对于循环依赖)可以将所有库放在一个列表变量中,然后将该列表添加两次(如果需要,可以添加更多),如:
set(LINK_LIBS "liba libb libc")
target_link_libraries(app ${LINK_LIBS} ${LINK_LIBS})
(或者只是在target_link_libraries
函数中相继输入两次列表)
这对我有用了很多次,但我承认可能存在一些我不知道的缺点(除了看起来有点像黑客)。