Cmake - Can a shared library executable be linked with a relative path at runtime?
Suppose I have this:
../project_dir main.cpp mylib.cpp mylib.h
Stages of creation:
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
will be my binary executable output. When I test with:
ldd exec
output string:
libmylib.so => /full/path/to/build/directory/libmylib.so (0x00007f75fdd1f000)
This line of output is my question, is it possible to get:
libmylib.so => ./libmylib.so
so whenever I move the executable, I can move the shared library with it. If possible, how can I do it using cmake?
source to share
When you run the ldd
app's shared library to check for dependencies, it always prints absolute paths. But if you use -rpath
oprtion along with a variable $ORIGIN
, everything will work as you expect. You can move the executable and shared library, delete the original build directory and you can still run the application.
This is how you can do it using 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)
source to share