使用-L添加link_library时,Cmake不设置RPATH

时间:2014-08-19 07:59:18

标签: cmake rpath

以下列方式设置链接库

target_link_libraries (SOME_TARGET -L/somedir -lfoo)

cmake不处理RPATH。使用'-L'和'-l'不是最佳实践,或者实际上是错误的?在创建我自己的Find * .cmake时,我通常使用find_library(),但我得到的查找脚本不会这样做,并使用'-L'和'-l'转到上面的表单。

文档并没有真正解释如何收集RPATH,文档也不是很清楚如何处理“-l”和“-L”你得到的唯一指针是

  

“以 - ,但不是-l或-framework开头的项目名称被视为   链接器标志“

2 个答案:

答案 0 :(得分:6)

通常不建议指定工具链相关的标志,例如-l-L,因为它会破坏可移植性,并且可能会产生与预期不同的效果。

设置链接器路径的正确方法是link_directories命令。

CMake中的惯用解决方案是使用find_library来定位库,然后将完整路径传递给链接器,因此您根本不需要担心链接目录。

现在,RPATH是一个不同的野兽,因为它还决定了动态库在运行时的位置。通常,默认设置在这里工作得相当合适。如果您发现自己处于不幸的情况,那么会有许多目标属性和CMake变量影响这一点:

  

有一些属性用于指定RPATH规则。 INSTALL_RPATH   是一个以分号分隔的列表,指定要在安装中使用的rpath   目标(适用于支持它的平台)。 INSTALL_RPATH_USE_LINK_PATH   是一个布尔值,如果设置为true将在链接器中追加目录   搜索路径和项目外的INSTALL_RPATH。   SKIP_BUILD_RPATH是一个布尔值,指定是否跳过自动   生成允许目标从构建树运行的rpath。   BUILD_WITH_INSTALL_RPATH是一个布尔值,指定是否链接   使用INSTALL_RPATH在构建树中进行目标。这优先   超过SKIP_BUILD_RPATH并避免以前需要重新链接   安装。 INSTALL_NAME_DIR是指定目录的字符串   Mac OSX上共享库的“install_name”字段的一部分   在已安装的目标中使用。创建目标时的值   变量CMAKE_INSTALL_RPATH,CMAKE_INSTALL_RPATH_USE_LINK_PATH,   CMAKE_SKIP_BUILD_RPATH,CMAKE_BUILD_WITH_INSTALL_RPATH,以及   CMAKE_INSTALL_NAME_DIR用于初始化这些属性。

(来自set_target_properties docs

另外,您可能需要查看CMake Wiki page for RPATH handling

不幸的是,整个RPATH业务相当复杂,彻底的解释需要比StackOverflow答案更多的空间,但我希望这足以让你开始。

答案 1 :(得分:1)

基本上,您使用target_link_libraries()错了。根据{{​​3}},您应该提供目标,库以及一些 CMake 特定的链接标记。

例如类似的东西:

target_link_libraries(my_build_target somedir/foo.so)

如果您正在使用自己制作的Find*.cmake解决方案,那么它通常会像这样完成:

find_library(foo)
//build main target somewhere here
//now link it:
target_link_libraries(my_build_target ${FOO_LIBRARIES})

注意:我认为您精心制作的Find*.cmake文件会遵循这些documentation并填充CMake变量,例如SOMELIB_LIBRARIES和/或SOMELIB_INCLUDE_DIRS

注意2:,就我个人而言,target_link_directories()是一个痛苦的屁股,如果不是真的需要你应该避免使用它。维护和使用相对于当前源目录的路径很困难。