2015-05-25 91 views
3

可以說我有這樣的:cmake - 是否有可能在運行時將可執行文件與相對路徑鏈接到共享庫?

../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) 

即輸出線是我的問題,是有可能得到:

所以每當我移動可執行文件,我可以將共享庫一起移動。如果可能的話,如何用cmake做到這一點?

回答

3

當您啓動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) 
4

中庸之道添加在您的CMakefiles.txt

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

謝謝,這節省了我的一天! – dontloo

+0

當我用$ ORIGIN添加上面兩行以及上面的行時,仍然失敗: /usr/local/bin/cmake -E cmake_link_script CMakeFiles/app.dir/link.txt --verbose = 1 /usr/bin/C++ -Wl,-rpath -Wl,$ ORIGIN -rdynamic CMakeFiles/app.dir/app.cpp.o -o app -Wl,-rpath,「\ $ ORIGIN」 CMakeFiles/app.dir/app.cpp.o:在main函數中: app.cpp :(.text + 0x42):未定義引用MyClass :: app(std :: string const&)' collect2:error:ld返回1退出狀態 CMakeFiles/app.dir/build.make:94:目標'app'的配方失敗 make [2]:*** [app] Error 1 –

+0

CMake已更新,因此可能會有更改,現在錯了.. 對不起,我不再反對CMake,所以我沒有意識到這些變化。 – explo91

0

我只好把花括號周圍$ {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) 
相關問題