共享库的CMake和顺序依赖链接

时间:2012-08-30 20:18:04

标签: c++ cmake dynamic-linking

我正在构建一些小组件作为主应用程序的共享库。让我们使用libalibb的示例。每个都在它们自己的子目录中构建,如下所示:

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中订购库以进行链接是否有技巧?

2 个答案:

答案 0 :(得分:27)

您可以通过添加

指定ab之间的关系
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函数中相继输入两次列表)

这对我有用了很多次,但我承认可能存在一些我不知道的缺点(除了看起来有点像黑客)。

相关问题