CMake和顺序共享库的依赖性联(CMake and order dependent linking

2019-06-27 14:45发布

我有我建设作为我的主应用程序共享库的几个小零件。 允许使用的示例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引用。 如果我公司供应的库的顺序,而作为连接

target_link_libraries(dummy b a)

该程序编译和链接就好了

当这种系统的开始涉及库的更复杂的间依赖性,它开始是不可能的,即使依赖关系是非周期性。 我如何在这里管理连接步骤? 有没有窍门订货库在CMake的链接?

Answer 1:

您可以指定关系的ab加入

target_link_libraries(b a)


从文档 :

库依赖默认情况下传递的。 当这个目标链接到另一个目标,然后链接到该目标的库将出现在对其他对象的链接线了。

所以,如果你指定a作为的依赖b用这种方式,你甚至不需要明确的列出a在依赖于任何目标b ,即你的其他命令一样可以:

target_link_libraries(dummy b)

虽然它不会做任何伤害列出a为好。



Answer 2:

一个简单的解决方案(尤其是循环依赖)可能只是把你所有的库列表中的变量,然后添加列表两次(或更多,如果需要的话),如:

set(LINK_LIBS "liba libb libc")
target_link_libraries(app ${LINK_LIBS} ${LINK_LIBS})

(或仅仅在彼此之后在键入出名单两次target_link_libraries功能)

这工作对我来说相当几次,但我得承认,有可能是我不知道的(除了它似乎像一个黑客位)的一些可能的缺点。



文章来源: CMake and order dependent linking of shared libraries