ho costruito la mia libreria condivisa (io uso un lib calcolare il numero di Fibonacci per esempio) me stesso e si desidera utilizzare nel mio altro progetto C++ costruito da CMake
Perché CMake progettato in modo che rimuove percorso di esecuzione durante l'installazione
diciamo che la libreria condivisa e le intestazioni situato nel /path/to/my/lib
, la libreria condivisa libfib.so
è in /path/to/my/lib/lib
e l'intestazione fib.h
è in /path/to/my/lib/include
e il mio progetto trovano in /path/to/my/project
Qui è la mia originale 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)
e io uso questo script per compilare e installare il mio progetto:
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 ..
Ora, dopo aver eseguito lo script di installazione, ho ottenuto due eseguibili, uno in build_dir
, uno nel percorso di installazione path/to/my/project/bin
, durante l'esecuzione il programma in build_dir
, tutto va bene, ma quando si esegue il programma installato, ottengo:
./bin/mybin: errore durante il caricamento delle librerie condivise: file oggetto non può aprire comune:: libfib.so No such file o directory
Dopo qualche ricerca su google e StackOverflow, sapevo sembra che CMake
rimosso il percorso di ricerca di runtime che è legato al file eseguibile quando si costruisce. Ora so due modi per ottenere in giro:
- aggiungere il percorso biblioteca dove
libfib.so
individua per la variabile d'ambienteLD_LIBRARY_PATH
- Aggiungi
set_target_properties(${EXE} PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE)
nel mioCMakeLists.txt
Quindi, le mie domande sono:
- Perché lo
CMake
è stato progettato in questo modo? Durante l'installazione, perché rimuoverà il percorso di runtime dagli eseguibili invece di copiare semplicemente gli eseguibili costruiti nella destinazione di installazione o qualsiasi altra cosa mantenendo il percorso del collegamento per il programma installato? - Qual è la via migliore (o esiste una best practice) per eliminare questo problema? Per impostare l'ambiente o aggiungere
set_target_properties(...)
aCMakeLists.txt
?
I trovo che se aggiungo 'SET (CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)' dopo 'add_executable ($ {EXE} main.cpp)', cmake continua a spogliare il percorso di runtime, mentre 'set_target_properties ($ {EXE} PROPRIETÀ INSTALL_RPATH_USE_LINK_PATH TRUE)' sarebbe alwa funziona indipendentemente dalla sua posizione in 'CMakeLists.txt' – Alaya