2017-04-10 180 views
2

我想鏈接第三方libLibrary.so並將其與我的程序分發。如果用戶解壓我的檔案,他就會獲得這個文件夾結構:如何使用CMake鏈接共享庫與相對路徑

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,使這完全不可移植!

我該如何使鏈接路徑相對而不是絕對?

回答

0

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,然後分發安裝二進制文件。

如果你想從你的建造樹中的二進制分發,還可以繞過的CMake的rpath處理和修改rpath的直接使用連接器選項:

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