如何将共享库与具有相对路径的 CMake 链接
How to link a shared library with CMake with relative path
我想链接第三方libLibrary.so
并将其与我的程序一起分发。如果用户解压缩我的存档,他将得到这个文件夹结构:
game
libLibrary.so
game_executable
game_executable
取决于./libLibrary.so
.
我的项目结构:
game
bin
libLibrary.so
lib
Library.h
src
game_executable.cpp
CMakeLists.txt
我的CMakeLists.txt
:
cmake_minimum_required(VERSION 3.7)
project(game)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/bin)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR})
set(SOURCE_FILES src/game_executable.cpp)
include_directories(${CMAKE_SOURCE_DIR}/lib)
add_executable(game ${SOURCE_FILES})
target_link_libraries(${PROJECT_NAME} ${CMAKE_BINARY_DIR}/libLibrary.so)
但是,我得到的是我的game_executable
取决于.../game/bin/libLibrary.so
,而不是带有game_executable
的文件夹中的./libLibrary.so
,这使得它完全无法移植!
如何使链接路径相对而不是绝对
从文档中:
默认情况下,如果不更改任何与 RPATH 相关的设置,CMake 会将可执行文件和具有完整 RPATH 的共享库链接到构建树中所有使用的库。
这就是你所看到的行为。
但是,有许多方法可以更改此设置以匹配所需的行为。
上面链接文档中的一些示例:
# use, i.e. don't skip the full RPATH for the build tree
SET(CMAKE_SKIP_BUILD_RPATH FALSE)
# when building, don't use the install RPATH already
# (but later on when installing)
SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
# the RPATH to be used when installing
SET(CMAKE_INSTALL_RPATH "")
# don't add the automatically determined parts of the RPATH
# which point to directories outside the build tree to the install RPATH
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)
使用上述方法,您可能需要设置CMAKE_INSTALL_RPATH
然后分发已安装的二进制文件。
如果要从构建树中的二进制文件分发,还可以绕过 CMake 的 rpath 处理,并使用链接器标志直接修改 rpath:
set_target_properties(game PROPERTIES LINK_FLAGS "-Wl,-rpath,./")
大多数情况下,您希望将RPATH
设置为$ORIGIN
而不是.
,因为它引用可执行文件的路径,而.
引用运行时的当前目录(可以是其他任何内容(。
我发现编辑LINK_FLAGS
而不是INSTALL_RPATH
目标属性很简单,因为 CMakes 已经有一个名为 ORIGIN
的变量(请参阅 CMake 的文档(。
因此,这归结为以下内容:
# Find shared libraries next to the executable
set_target_properties(target_name PROPERTIES
BUILD_WITH_INSTALL_RPATH FALSE
LINK_FLAGS "-Wl,-rpath,$ORIGIN/")
谈论使用动态链接库和 CMake 构建系统分发可执行文件或共享库:
SET(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE)
此 var 强制与构建树中的相对路径链接,因此构建目录可以移动。
如果您在 Linux 计算机上使用此命令
find <YOUR_TARGET_NAME> -type f -perm /a+x -exec ldd {} ; | grep so | sed -e '/^[^t]/ d' | sed -e 's/t//' | sed -e 's/.*=..//' | sed -e 's/ (0.*)//' | sort | uniq -c | sort -n
您将在路径中看到点,表示相对论,例如: ~/project/build/./lib/my_shared_lib.so
在 CMake 文档中查看更多信息。
如果使用target_link_directories
则 cmake 会将其作为手动 rpath 添加到链接器命令中
- 如何使用cppcheck处理半相对包含路径
- Windows 和 Linux 之间的相对路径分辨率差异?
- 如何获取 CMake 单元测试的相对路径?
- Bazel:http_archive()中url的相对本地路径
- 在Visual Studio Code(.json配置)中设置相对于工作区路径的c / c ++项目的包含路径
- 从另一个应用启动我的应用时出现相对路径更改问题
- CMake 链接 2 个具有相对路径的库
- cmake find_package CMakeLists.txt 子文件夹中的相对路径
- 定义相对包括路径
- cmake:包括vs vs add_subDirectory:相对标头文件路径
- 使用相对标头包含路径重新分析 ASTUnit 失败
- 在可执行文件中使用带有符号链接的相对路径
- C++流找不到相对路径
- 如何将COM .tlb文件导入具有相对路径C++文件中?
- C++包括断开的相对路径
- CMake 安装具有相对路径的目标
- CMake为什么通过相对路径链接外部库
- Boost Filesystem flowly_caronical不会在没有父文件夹的情况下解决相对路径
- 在“其他包含目录”中添加的路径相对于什么
- 如何获得与给定的相对路径相对应的绝对库文件名