是否可以在运行时将可执行文件链接到具有相对路径的共享库

Is it possible to link executable to shared library with relative path at runtime?

本文关键字:相对 路径 共享 链接 运行时 可执行文件 是否      更新时间:2023-10-16

我们设这个:

../project_dir
    main.cpp
    mylib.cpp
    mylib.h

构建步骤如下:

g++ -c mylib.cpp -o mylib.o
g++ -shared -o libmylib.so mylib.o
g++ -L$(pwd) -Wl,-rpath='$ORIGIN' -o exec main.cpp -lmylib

exec将是我的二进制可执行输出。当我使用:

进行测试时
ldd exec

输出行为:

libmylib.so => /full/path/to/build/directory/libmylib.so (0x00007f75fdd1f000)

这个输出行是我的问题,是否有可能得到:

libmylib.so => ./libmylib.so

所以无论何时移动可执行文件,我都可以移动共享库。如果可能的话,用cmake怎么做?

添加到CMakefiles.txt

set(CMAKE_INSTALL_RPATH "$ORIGIN")
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) # only if you want copy from the build tree

当你启动ldd来检查你的应用程序共享库依赖时,它总是打印绝对路径。但是,如果您将-rpath操作与$ORIGIN变量一起使用,则一切都将如您所期望的那样工作。你可以移动可执行文件和共享库,删除原始构建目录,你仍然可以启动你的应用程序。

你可以使用cmake:

project(myapp)
cmake_minimum_required(VERSION 2.8)
set(APP_SRC main.cpp)
set(LIB_SRC mylib.cpp)
link_directories(${CMAKE_CURRENT_BINARY_DIR})
SET(CMAKE_EXE_LINKER_FLAGS
          "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath -Wl,$ORIGIN")
add_library(mylib SHARED ${LIB_SRC})
add_executable(${PROJECT_NAME} ${APP_SRC})
target_link_libraries(${PROJECT_NAME} mylib)

我必须在${ORIGIN}周围加上花括号,并添加库链接的路径:

SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${CMAKE_BINARY_DIR} -lmyLibrary -Wl,-rpath -Wl,${ORIGIN}")
set(CMAKE_INSTALL_RPATH "${ORIGIN}")
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)