CMAKE RPATH无法正常工作 - 找不到共享对象文件

The*_*Man 6 makefile cmake

LD_LIBRARY_PATH每次运行程序时都试图摆脱设置.在库中添加并将我的可执行文件定位到库后,当我运行它时告诉我它无法打开共享库,没有这样的文件或目录.

在我的CMakeLists.txt中,我有:

add_library(heart SHARED ${HEART_FILES})
add_executable(run ${RUN_FILES})
target_link_libraries(run heart)
set(CMAKE_SKIP_BUILD_PATH FALSE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
set(CMAKE_INSTALL_RPATH "~/person/target/usr/local/lib")
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
Run Code Online (Sandbox Code Playgroud)

我设置了一个绝对链接到我的库文件夹,以测试这是否会创建一个rpath到我的库,似乎没有.我检查并确保共享库确实在lib中.libheart.so是要链接的文件.我还缺少什么?

exp*_*o91 13

这是因为你建立了心脏并从同一个cmake项目运行:

CMAKE_INSTALL_RPATH_USE_LINK_PATH是一个有趣且非常有用的选项.使用RPATH构建目标时,CMake通过使用此目标链接的所有库的目录来确定RPATH.其中一些库可能位于同一构建树中,例如libbar.so,这些目录也会添加到RPATH中. 如果启用此选项,则除了构建树中的那些目录之外的所有这些目录都将自动添加到安装RPATH中.然后,RPATH中可能仍然缺少的唯一目录是安装相同项目(即libbar.so)的库的目录.如果库的安装目录不是系统缺省库目录之一,则必须通过相应地设置CMAKE_INSTALL_RPATH将此目录自己添加到安装RPATH中

你可以试试这个:

SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
Run Code Online (Sandbox Code Playgroud)

这里有更多文档cmake rpath处理

编辑:

只有这应该工作:

set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

add_library(heart SHARED ${HEART_FILES})
add_executable(run ${RUN_FILES})
target_link_libraries(run heart)

install(
  TARGETS heart run
  RUNTIME DESTINATION bin
  LIBRARY DESTINATION lib
)
Run Code Online (Sandbox Code Playgroud)

清理您的构建目录,然后:

cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=/home/person/target/usr/local ..
make install
Run Code Online (Sandbox Code Playgroud)

链接CXX可执行文件的g ++行结束时,您应该看到-Wl,-rpath,/ home/person/target/usr/local/lib

如果您想要一个完全可重定位的包:

set(CMAKE_INSTALL_RPATH "$ORIGIN/../lib")
Run Code Online (Sandbox Code Playgroud)

PS:你觉得它是libheart.so那是不是找不到?


fgi*_*eau 6

在 CMake 文件中,在定义目标之前设置 RPATH。必须CMAKE_INSTALL_RPATH在调用之前定义add_executable(),否则无效。