Warum ist CMake so ausgelegt, dass es entfernt-runtime-Pfad bei der Installation

Baute ich mein shared library(benutze ich eine lib die Berechnung der fibonacci-Zahl für Beispiel) für mich und möchte es in meinem anderen c++ - Projekt, gebaut von CMake

Sagen wir, die shared-Bibliothek und-Header befindet sich in /path/to/my/lib, die gemeinsam genutzte Bibliothek libfib.so ist in /path/to/my/lib/lib und der header fib.h ist in /path/to/my/lib/include und mein eigenes Projekt befindet sich in /path/to/my/project

Hier ist mein original CMakeLists.txt:

cmake_minimum_required(VERSION 3.2)
project(learn-lib)
set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
set(FIB_INCLUDE "${FIB_PREFIX}/include")
set(FIB_LIB "${FIB_PREFIX}/lib")
set(EXE mybin)
include_directories(${FIB_INCLUDE})
link_directories(${FIB_LIB})
add_executable(${EXE} main.cpp)
target_link_libraries(${EXE} fib)
install(TARGETS ${EXE} RUNTIME DESTINATION bin)

Und ich nutze dieses Skript zu erstellen und installieren Sie mein Projekt:

mkdir -p build_dir
cd build_dir
cmake -DFIB_PREFIX=/path/to/my/lib \
      -DCMAKE_INSTALL_PREFIX=/path/to/my/project \
      ..
make
make install
cd ..

Nun, nach dem ausführen des install-Skript, habe ich zwei Dateien, eine in build_dir man in das Installationsverzeichnis path/to/my/project/bin, wenn das Programm läuft in build_dir ist alles in Ordnung, aber beim ausführen des installierten Programms, erhalte ich:

./bin/mybin: error while loading shared libraries: libfib.also: nicht öffnen können shared object-Datei: Keine solche Datei oder das Verzeichnis

Nach einiger Suche bei google und stackoverflow, ich wusste, dass es scheint, dass CMake entfernt der Laufzeit-Suchpfad, gebunden, um die ausführbare Datei beim Bau. Ich weiß jetzt zwei Möglichkeiten, um ihn herum:

  1. Fügen Sie den library-Pfad, wo libfib.so sucht, um die Umgebungsvariable LD_LIBRARY_PATH
  2. Hinzufügen set_target_properties(${EXE} PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) in meine CMakeLists.txt

So, meine Fragen sind:

  1. Warum ist CMake so ausgelegt? Bei der Installation, warum sollte es entfernen runtime Pfad von ausführbaren Dateien, anstatt nur das kopieren der integrierten ausführbaren Dateien, die zum installieren ein Ziel oder was auch immer halten Sie die link-Pfad für das zu installierende Programm?
  2. Welcher Weg ist der beste-Praxis(oder gibt es eine best practice) um dieses problem zu beseitigen? Um die Umgebung oder das hinzufügen set_target_properties(...) in CMakeLists.txt ?
InformationsquelleAutor Alaya | 2015-09-09
Schreibe einen Kommentar