2015-09-09 11 views
5

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 CMakePerché 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:

  1. aggiungere il percorso biblioteca dove libfib.so individua per la variabile d'ambiente LD_LIBRARY_PATH
  2. Aggiungi set_target_properties(${EXE} PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) nel mio CMakeLists.txt

Quindi, le mie domande sono:

  1. 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?
  2. Qual è la via migliore (o esiste una best practice) per eliminare questo problema? Per impostare l'ambiente o aggiungere set_target_properties(...) a CMakeLists.txt?

risposta

5

Si consiglia di guardare in CMake's RPATH handling settings

Questa citazione, in particolare, sembra rilevanti per la vostra situazione:

Per impostazione predefinita, se non si modificano le impostazioni relative rPath, CMake collegherà la eseguibili e librerie condivise con RPATH completo a tutte le librerie utilizzate nell'albero di compilazione. Durante l'installazione, cancellerà il RPATH di questi obiettivi in ​​modo che vengano installati con un RPATH vuoto.

È possibile impostare il RPATH che è impostato per i binari installati usando la variabile CMAKE_INSTALL_RPATH, ad esempio:

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

e si può anche disattivare il RPATH strippaggio durante l'installazione:

SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) 
+4

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