我想在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中? 那将是一种矫枉过正......
答案 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.System与Boost.Filesystem不同。确保您实际链接到正确的库。
从编辑开始,您似乎正在处理两个单独的CMake项目,这意味着您必须将mylib
的依赖关系链转移到另一个项目。看看CMake's packaging mechanism如何做到这一点。