如何使用相对路径将共享库与CMake链接

wbgh16ku  于 2022-11-11  发布在  其他
关注(0)|答案(4)|浏览(278)

我想链接一个第三方的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,而不是./libLibrary.so,这是在文件夹中与game_executable,使这完全不可移植!
如何将链接路径设置为相对路径而不是绝对路径?

ebdffaop

ebdffaop1#

documentation
默认情况下,如果您不更改任何与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,然后分发 installed 二进制文件。
如果你想从构建树中的二进制文件进行分发,也可以绕过CMake的rpath处理,直接使用链接器标志修改rpath:

set_target_properties(game PROPERTIES LINK_FLAGS "-Wl,-rpath,./")
bq8i3lrv

bq8i3lrv2#

大多数情况下,您希望将RPATH设置为$ORIGIN,而不是.,因为它引用的是可执行文件的路径,而.引用的是运行时的当前目录(可以是任何其他目录)。
我发现编辑LINK_FLAGS而不是INSTALL_RPATH目标属性很简单,因为CMakes已经有一个名为ORIGIN的变量(请参见CMake's documentation)。
因此,这可以归结为以下几点:


# Find shared libraries next to the executable

set_target_properties(target_name PROPERTIES
        BUILD_WITH_INSTALL_RPATH FALSE
        LINK_FLAGS "-Wl,-rpath,$ORIGIN/")
pieyvz9o

pieyvz9o3#

讨论使用动态链接库和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 docs

enyaitl3

enyaitl34#

如果使用target_link_directories,则cmake会将其作为手动rpath添加到链接器命令中

相关问题