2015-09-09 15 views
5

zbudowałem mój wspólna biblioteka (używam lib obliczania liczby Fibonacciego na przykład) się i chcesz go używać w moim innym C++ projektu zbudowany przez CMakeDlaczego CUpewnij zaprojektowany tak, że usuwa ścieżkę wykonania podczas instalowania

Powiedzmy, że wspólna biblioteka i nagłówki położony w /path/to/my/lib, wspólna biblioteka libfib.so jest /path/to/my/lib/lib a nagłówek fib.h w /path/to/my/lib/include i mój własny projekt zlokalizowany w /path/to/my/project

Oto mój oryginalny 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) 

i używam tego skryptu zbudować i zainstalować mój 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 .. 

Teraz, po uruchomieniu skrypt instalacyjny, mam dwa pliki wykonywalne, jeden w build_dir, jeden w miejscu zainstalowania path/to/my/project/bin, gdy uruchomiony program w build_dir, wszystko jest w porządku, ale podczas uruchamiania zainstalowanego programu, otrzymuję:

./bin/mybin: błąd podczas ładowania biblioteki współdzielone: ​​libfib.so: nie można otworzyć pliku obiektu dzielonego: nie ma takiego pliku lub katalog

Po pewnym wyszukiwaniu w google i stackoverflow, wiedziałem, że wygląda na to, że CMake usunął ścieżkę wyszukiwania środowiska wykonawczego, która jest związana z plikiem wykonywalnym podczas budowania. Teraz wiem na dwa sposoby, aby to około:

  1. dodać ścieżkę biblioteki gdzie libfib.so lokalizuje w środowisku zmiennym LD_LIBRARY_PATH
  2. Dodaj set_target_properties(${EXE} PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) do mojego CMakeLists.txt

Więc moje pytania to:

  1. Dlaczego zaprojektowano CMake? Podczas instalacji, dlaczego miałby usunąć ścieżkę środowiska wykonawczego z plików wykonywalnych, zamiast tylko kopiować skompilowane pliki wykonywalne do miejsca docelowego instalacji lub cokolwiek zachowując ścieżkę łącza dla zainstalowanego programu?
  2. Który sposób jest najlepszą praktyką (lub czy istnieje najlepsza praktyka) w celu wyeliminowania tego problemu? Aby ustawić środowisko lub dodać set_target_properties(...) do?

Odpowiedz

5

Możesz zajrzeć do CMake's RPATH handling settings

Ten cytat w szczególności wydaje się istotne dla kłopotliwej sytuacji:

Domyślnie, jeśli nie zmienia żadnych ustawień rpath związane, CUpewnij połączy pliki wykonywalne i biblioteki współdzielone z pełną RPATH do wszystkich używanych bibliotek w drzewie kompilacji. Podczas instalacji usunie RPATH tych obiektów docelowych, aby zainstalować je z pustym RPATH.

Można ustawić rpath który jest ustawiony dla zainstalowanych plików binarnych przy użyciu zmiennej CMAKE_INSTALL_RPATH, na przykład:

SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") 

można także wyłączyć rpath odpędzania podczas instalacji:

SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) 
+4

I jeśli dodam 'SET (CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)' po 'add_executable ($ {EXE} main.cpp)', cmake nadal będzie usuwać ścieżkę środowiska wykonawczego, podczas gdy 'set_target_properties ($ {EXE} PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) będzie alwa ys działa niezależnie od jego pozycji w 'CMakeLists.txt' – Alaya