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 CMake
Dlaczego 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:
- dodać ścieżkę biblioteki gdzie
libfib.so
lokalizuje w środowisku zmiennymLD_LIBRARY_PATH
- Dodaj
set_target_properties(${EXE} PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE)
do mojegoCMakeLists.txt
Więc moje pytania to:
- 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? - 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?
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