【发布时间】:2015-12-04 20:32:48
【问题描述】:
我自己构建了我的共享库(例如,我使用了一个计算斐波那契数的库)并希望在我由CMake 构建的另一个 c++ 项目中使用它
假设共享库和头文件位于/path/to/my/lib,共享库libfib.so 位于/path/to/my/lib/lib,头文件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:加载共享库时出错:libfib.so:无法打开共享对象文件:没有这样的文件或目录
在 google 和 stackoverflow 上进行一些搜索后,我知道CMake 似乎在构建时删除了与可执行文件相关联的运行时搜索路径。我现在知道了两种解决方法:
- 将
libfib.so所在的库路径添加到环境变量LD_LIBRARY_PATH中 - 将
set_target_properties(${EXE} PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE)添加到我的CMakeLists.txt
所以,我的问题是:
- 为什么
CMake会这样设计?安装时,为什么要从可执行文件中删除运行时路径,而不是将构建的可执行文件复制到安装目标或保留已安装程序的链接路径? - 哪种方法是消除此问题的最佳实践(或是否有最佳实践)?设置环境或将
set_target_properties(...)添加到CMakeLists.txt中?
【问题讨论】:
标签: c++ hyperlink cmake shared-libraries