在 CMake 仅标头库中生成,"stores"其对 boost 文件系统的依赖性



我想在cmake中从header.h生成一个仅头部的库,它依赖于libboostrongystem。我可以编译库而不会遇到问题:

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时,它无法找到boost库,并出现ld错误。

失败是有道理的,但我不知道如何在CMake中解决它。如何"存储"mylib的boost依赖关系?所以我不必担心在其他外部项目中找到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中?那太夸张了。。。

将CMake版本更新至2.8.12或更新版本。

您正在寻找的功能是传递依赖关系处理。它是由CMake策略CMP0022切换的,所以请确保您不会意外地在某个地方关闭它。引用CMake 3.1:中target_link_libraries的手册页

默认情况下,库依赖项可通过此签名传递。当此目标链接到另一个目标时,库链接到此目标的将显示在另一个目标的链接线上目标也是。这个可传递的"链接接口"存储在INTERFACE_LINK_LIBRARIES目标属性,并且可能被重写直接设置属性。当CMP0022未被设置为NEW时,传递链接是内置的,但可能被LINK_INTERFACE_LIBRARIES属性。调用此的其他签名命令可以设置使任何库以独占方式链接的属性私人签名。

顺便说一句,Boost.System与Boost.Filesystem不同。请确保您确实链接到了正确的库。

从您的编辑来看,您似乎正在处理两个独立的CMake项目,这意味着您必须将mylib的依赖链转移到另一个项目。看看CMake的包装机制,了解如何做到这一点。

相关内容

最新更新