cmake - 是否可以 link 可执行文件在运行时使用相对路径共享库?
cmake - Is it possible to link executable to shared library with relative path at runtime?
假设我有这个:
../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做到这一点?
当您启动 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)
只需添加您的 CMakefiles.txt
set(CMAKE_INSTALL_RPATH "$ORIGIN")
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) # only if you want copy from the build tree
我不得不在 ${ORIGIN} 周围加上花括号并将库的路径添加到 link:
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)
假设我有这个:
../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做到这一点?
当您启动 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)
只需添加您的 CMakefiles.txt
set(CMAKE_INSTALL_RPATH "$ORIGIN")
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) # only if you want copy from the build tree
我不得不在 ${ORIGIN} 周围加上花括号并将库的路径添加到 link:
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)