在CMake标题库中生成"存储"它依赖于boost文件系统

时间:2015-03-02 06:22:48

标签: c++ boost linker cmake

我想在cmake中生成一个来自header.h的头文件库,它依赖于libboost_system。 我可以在没有问题的情况下编译库:

find_package(Boost COMPONENTS
        system filesystem
        REQUIRED)
include_directories(SYSTEM ${Boost_INCLUDE_DIRS})
add_library(mylib header.h)
target_link_libraries(mylib PUBLIC ${Boost_LIBRARIES})
set_target_properties(mylib PROPERTIES LINKER_LANGUAGE CXX)

但是当我链接到其他地方的mylib时,它找不到带有ld错误的boost库。

失败是有道理的,但我不知道如何在CMake中解决它。 我如何"存储"对mylib的提升依赖?所以我不必担心在其他外部项目中找到boost库吗?

编辑:我正在使用cmake 3.2

更新:mylib是一个SHARED lib(.so),当我在其他项目中使用它时,链接器无法找到boost库:

target_link_libraries(newproject.exe ${external_mylib})

undefined reference to symbol '_ZN5boost6system15system_categoryEv'
/PATH/TO/libboost_system-mt-d.so.1.57.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

如果我再次明确地链接到Boost_LIBRARIES,它就会被解决。 target_link_libraries(newproject.exe ${external_mylib} ${Boost_LIBRARIES))

这并不能避免再次找到boost_libraries,也许解决方法是将boost_libraries放在环境变量LD_LIBRARY_PATH中? 那将是一种矫枉过正......

1 个答案:

答案 0 :(得分:1)

将您的CMake版本更新为2.8.12或更高版本。

您要查找的功能是transitive dependency handling。它由CMake策略CMP0022切换,因此请确保您不会意外地将其切换到某处。引自manpage for target_link_libraries in CMake 3.1

  

默认情况下,使用此签名,库依赖项是可传递的。   当此目标链接到另一个目标时,然后是库   链接到此目标将显示在另一个链接行的链接上   目标也是。这个传递性的“链接接口”存储在   INTERFACE_LINK_LIBRARIES目标属性,可能会被覆盖   直接设置属性。当CMP0022未设置为NEW时,   传递链接是内置的,但可能会被覆盖   LINK_INTERFACE_LIBRARIES属性。打电话给其他签名   命令可以设置属性使任何库专门链接   通过这个签名私人。

顺便说一下,Boost.SystemBoost.Filesystem不同。确保您实际链接到正确的库。

从编辑开始,您似乎正在处理两个单独的CMake项目,这意味着您必须将mylib的依赖关系链转移到另一个项目。看看CMake's packaging mechanism如何做到这一点。