以下列方式设置链接库时
target_link_libraries (SOME_TARGET -L/somedir -lfoo)
Run Code Online (Sandbox Code Playgroud)
cmake不处理RPATH.使用'-L'和'-l'不是最佳实践,或者实际上是错误的?在创建我自己的Find*.cmake时,我经常使用,find_library()
但我得到的查找脚本没有这样做,并使用'-L'和'-l'转到上面的表单.
文档并没有真正解释如何收集RPATH,文档也不是很清楚如何处理"-l"和"-L"你得到的唯一指针是
"以 - ,但不是-l或-framework开头的项目名称被视为链接器标志"
通常不建议使用-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的值来初始化这些属性.
此外,您可能希望查看用于RPATH处理的CMake Wiki页面.
不幸的是,整个RPATH业务相当复杂,彻底的解释需要比StackOverflow答案更多的空间,但我希望这足以让你开始.
归档时间: |
|
查看次数: |
11067 次 |
最近记录: |