2017-04-10 2 views
2

Ich möchte eine Drittanbieter-libLibrary.so verknüpfen und mit meinem Programm verteilen. Wenn Benutzer mein Archiv entpackt, wird er diese Ordnerstruktur erhalten:Wie verlinke ich eine gemeinsame Bibliothek mit CMake mit relativen Pfad

game 
    libLibrary.so 
    game_executable 

game_executable auf ./libLibrary.so abhängt.

Meine Projektstruktur:

game 
    bin 
    libLibrary.so 
    lib 
    Library.h 
    src 
    game_executable.cpp 
    CMakeLists.txt 

Mein 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) 

Aber was ich meine ist game_executable auf dem .../game/bin/libLibrary.so hängt nicht von der ./libLibrary.so, die mit game_executable in dem Ordner befindet, macht dies völlig unportabel!

Wie kann ich Link-Pfad relativ statt absolut machen?

Antwort

0

Vom documentation:

standardmäßig, wenn Sie irgendwelche RPATH bezogenen Einstellungen nicht ändern, wird CMake die ausführbaren Dateien verknüpfen und gemeinsam genutzte Bibliotheken mit voller RPATH für alle verwendeten Bibliotheken in dem Build-Baum.

Dies ist das Verhalten, das Sie sehen.

Es gibt jedoch mehrere Möglichkeiten, dies zu ändern, um das von Ihnen gewünschte Verhalten zu erreichen.

Einige Beispiele aus den oben verlinkten Dokumente:

# 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) 

die oben Sie verwenden werden wahrscheinlich wollen CMAKE_INSTALL_RPATH setzen und dann die binäre installiert verteilen.

Wenn Sie aus dem binären in Ihrem Build Baum verteilen möchten, ist es auch möglich CMake die rpath Handhabung und ändern Sie die rpath direkt mit Linker-Flags umgehen:

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