在 CMake 仅标头库中生成,"stores"其对 boost 文件系统的依赖性
Generate in CMake header-only library that "stores" its dependency on boost filesystem
我想在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的包装机制,了解如何做到这一点。
- 从R调用C++函数并对其进行集成时出错
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 将分数转换为十进制数并对其进行排序
- 常量函数,当其参数是对文字类型的引用时
- 更改其类型后,丢失对 std::variant 对象的引用
- 我可以从其变量中获取对类对象的引用吗?
- 测试驱动开发 c++:如何将对象添加到向量中,将歌曲添加到播放列表并对其进行测试
- 冒泡排序中所需的交换次数,而无需实际对其进行排序
- 在命名空间中声明变量,在 main 中定义它,使其对所有其他文件可见
- 使用指针向量(带代码)C++(以及对其使用的便利性的怀疑)时出现问题
- 如何延迟生成已完成的项目序列并对其进行迭代
- C++:在进行切片时对迭代器的约定,特别是对于访问最后一个元素并最终将其删除
- 为什么对引用的常量引用会失去其恒定性?
- 对模板运算符的未定义引用,其定义位于同一头文件中
- 结构新手,我对如何从 void 函数中返回值并将其放入另一个函数感到困惑
- 为什么我的矢量不随我对其元素所做的更改而更新
- 如果着色器中未使用绑定属性位置,是否会对其进行惩罚
- C#/C++:启动应用程序并处理其对系统的I/O调用
- 在 CMake 仅标头库中生成,"stores"其对 boost 文件系统的依赖性
- 当光标不在QSpinBox上时,使其对鼠标滚轮事件作出反应