【问题标题】:Creating binary with CMake removes runtime path使用 CMake 创建二进制文件会删除运行时路径
【发布时间】:2011-03-22 02:10:17
【问题描述】:

我正在使用 CMake 在 linux 上构建程序。程序编译成功并从项目构建目录运行。该程序与目录${HOME}/build/lib中的自定义库链接

我有一个安装阶段:

install(TARGETS ProgName RUNTIME DESTINATION bin)

当我运行 make install 时,程序会被放到正确的位置,但 cmake 安装程序会从二进制文件中删除运行时路径。

-- Install configuration: "Debug"
-- Installing: *binary name*
-- Removed runtime path from "*binary name*"

我已阅读 Internet 上讨论滥用 LD_LIBRARY_PATH 变量的文章,因此我希望尽可能将我的限制在系统库位置。我不是系统管理员,所以我也无法将该位置添加到默认链接器搜索路径。

有谁知道在安装或至少自定义添加到运行时的路径时如何保持开发时链接路径?

干杯

【问题讨论】:

  • 您还应该确保 CMake 使用与 -Wl,--enable-new-dtags 等效的 ld。这样可以确保您获得RUNPATH,而不是RPATHRUNPATH 可以被LD_LIBRARY_PATH 覆盖,而RPATH 不能。 make check 在安装之前在构建目录中就地运行时通常很重要。

标签: linux runtime linker cmake


【解决方案1】:

注意:如果您不想修改 cmake 脚本本身,设置属性,您可以启动 cmake 并使用指令要求不删除运行时路径:
见“Variables that Control the Build”,变量:“CMAKE_SKIP_RPATH

如果为真,则不要添加运行时路径信息。

如果设置为 TRUE,则不会将 rpath 信息添加到已编译的可执行文件中。
如果平台支持,默认是添加 rpath 信息。这允许从构建树轻松运行。
要在安装步骤中省略 RPATH 而不是构建步骤,请改用 CMAKE_SKIP_INSTALL_RPATH

如果交付已经包含正确的运行时路径,该指令将避免 cmake 对所述交付中包含的当前运行时路径进行任何修改。

cmake -DCMAKE_SKIP_RPATH=ON xxx.cmake

【讨论】:

  • 超级!谢谢,比第一个答案好多了!
  • +1,感谢您的回答,正是我想要的,即让 CMake behave 像默认情况下应该做的那样!
【解决方案2】:

您应该查看 set_target_properties 命令和属性 BUILD_WITH_INSTALL_RPATH

http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:set_target_properties

【讨论】:

  • 谢谢你,设法让它与set_property(TARGET *binary* PROPERTY INSTALL_RPATH_USE_LINK_PATH TRUE) 行一起工作,它将运行时路径设置为构建链接路径。干杯
【解决方案3】:

这适用于 CMake 2.8

 set_target_properties(foo PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE)

foo 是您之前定义的目标:

 project(foo)
 add_executable(foo ...)
  ...
 install(TARGETS foo DESTINATION bin)
  ...

之前

% sudo make install
Install the project...
-- Install configuration: ""
-- Installing: /opt/mystuff/bin/foo
-- Removed runtime path from "/opt/mystuff/bin/foo"

之后

% sudo make install
Install the project...
-- Install configuration: ""
-- Installing: /opt/mystuff/bin/foo
-- Set runtime path of "/opt/mystuff/bin/foo" to "/opt/zzyzx/lib:/opt/bar/lib/x86_64"

【讨论】:

  • 我做什么似乎并不重要,我总是得到Set runtime path of "/tmp/bin/program" to "。 Cmake 比 autotools 痛苦得多。
  • 看来在 CentOS/Redhat 上你需要设置 -DCMAKE_INSTALL_PREFIX:PATH=/usr/local 而不仅仅是 /usr
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
  • 2021-12-15
  • 2015-12-04
相关资源
最近更新 更多