我自己构建了我的共享库(例如,我使用一个计算斐波那契数的库),并希望在我的另一个 C++ 项目中使用它CMake
假设共享库和标头位于/path/to/my/lib
、共享库libfib.so
is in /path/to/my/lib/lib
和标题fib.h
is in /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:加载共享库时出错:libfib.so:无法打开共享对象文件:没有这样的文件或目录
经过谷歌和 stackoverflow 的一些搜索后,我知道似乎CMake
删除了构建时与可执行文件绑定的运行时搜索路径。我现在知道有两种方法可以解决这个问题:
- 添加库路径在哪里
libfib.so
定位到环境变量LD_LIBRARY_PATH
- Add
set_target_properties(${EXE} PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE)
进入我的CMakeLists.txt
所以,我的问题是:
- Why is
CMake
这么设计的?安装时,为什么它会从可执行文件中删除运行时路径,而不是仅将构建的可执行文件复制到安装目的地或保留已安装程序的链接路径?
- 哪种方法是消除此问题的最佳实践(或是否有最佳实践)?设置环境或添加
set_target_properties(...)
into CMakeLists.txt
?
您可能想了解一下CMake 的 RPATH 处理设置 http://www.cmake.org/Wiki/CMake_RPATH_handling
这句话似乎与您的困境特别相关:
默认情况下,如果您不更改任何 RPATH 相关设置,CMake 会将具有完整 RPATH 的可执行文件和共享库链接到构建树中的所有使用的库。安装时,它会清除这些目标的 RPATH,因此它们会使用空的 RPATH 进行安装。
您可以使用以下命令设置为已安装的二进制文件设置的 RPATHCMAKE_INSTALL_RPATH
变量,例如:
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
您还可以在安装过程中禁用 RPATH 剥离:
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)