c++ - 为什么 CMake 设计成在安装时删除运行时路径

标签 c++ hyperlink cmake shared-libraries

我自己构建了我的共享库(例如,我使用一个计算斐波那契数的库)并想在我的另一个由 CMake 构建的 c++ 项目中使用它

假设共享库和头文件位于/path/to/my/lib,共享库libfib.so位于/path/to/my/lib/lib 和 header fib.h 位于 /path/to/my/lib/include 而我自己的项目位于 /path/to/my/project

这是我的原始 CMakeLists.txt:

cmake_minimum_required(VERSION 3.2)
project(learn-lib)
set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
set(FIB_INCLUDE "${FIB_PREFIX}/include")
set(FIB_LIB "${FIB_PREFIX}/lib")
set(EXE mybin)
include_directories(${FIB_INCLUDE})
link_directories(${FIB_LIB})
add_executable(${EXE} main.cpp)
target_link_libraries(${EXE} fib)
install(TARGETS ${EXE} RUNTIME DESTINATION bin)

然后我使用这个脚本来构建和安装我的项目:

mkdir -p build_dir
cd build_dir
cmake -DFIB_PREFIX=/path/to/my/lib \
      -DCMAKE_INSTALL_PREFIX=/path/to/my/project \
      ..
make
make install
cd ..

现在,在运行安装脚本后,我得到了两个可执行文件,一个在 build_dir 中,一个在安装位置 path/to/my/project/bin 中,当在 build_dir 中运行程序,一切正常,但是在运行安装的程序时,我得到:

./bin/mybin: error while loading shared libraries: libfib.so: cannot open shared object file: No such file or directory

在 google 和 stackoverflow 上搜索之后,我知道 CMake 似乎在构建时删除了与可执行文件相关的运行时搜索路径。我现在知道两种解决方法:

  1. libfib.so所在的库路径添加到环境变量LD_LIBRARY_PATH
  2. set_target_properties(${EXE} PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) 添加到我的 CMakeLists.txt

所以,我的问题是:

  1. 为什么 CMake 是这样设计的?安装时,为什么它会从可执行文件中删除运行时路径,而不是仅仅将构建的可执行文件复制到安装目标或保留已安装程序的链接路径?
  2. 哪种方法是消除此问题的最佳做法(或是否有最佳做法)?要设置环境或将 set_target_properties(...) 添加到 CMakeLists.txt 中?

最佳答案

您可能需要查看 CMake's RPATH handling settings

这句话似乎与您的困境特别相关:

By default if you don't change any RPATH related settings, CMake will link the executables and shared libraries with full RPATH to all used libraries in the build tree. When installing, it will clear the RPATH of these targets so they are installed with an empty RPATH.

您可以使用 CMAKE_INSTALL_RPATH 变量设置为安装的二进制文件设置的 RPATH,例如:

SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")

您还可以在安装期间禁用 RPATH 剥离:

SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

关于c++ - 为什么 CMake 设计成在安装时删除运行时路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58170872/

相关文章:

CSS 用固定的 div 覆盖居中的文本,链接不起作用

CMake:源文件取决于源文件

CMake 从 Autoconf 生成 config.h

c++ - boost asio 异步 http 客户端超时?

c++ - 在递归函数中打印 C++ 中的累计和

c++ - 'auto' 关键字是否知道何时使用 const 迭代器?

php - 想使用 anchor 标记在另一个 phtml 文件中调用一个 phtml 文件

c# - 不能将超链接写成字符串

c++ - 让 Jenkins 忽略 cmake 错误

c++ - 为什么 mac os sdl2 程序窗口没有响应?