2014-10-01 27 views
9

Ho scritto un semplice programma C++ che usa boost che voglio distribuire su macchine della stessa architettura con qualsiasi gusto linux (per il momento) che può o meno avere boost versioni installate. Sono nuovo di distribuzione, ma ha cercato di leggere documenti e venire con un CMakeLists.txt che assomiglia:packaging C++ programma usando librerie boost con cmake/cpack

cmake_minimum_required(VERSION 2.8) 
project(myprog) 
FIND_PACKAGE(Boost 1.50 COMPONENTS thread system chrono program_options REQUIRED) 
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR}) 
add_executable(myprog myprog.cpp) 
target_link_libraries(myprog -lpthread -lboost_system -lboost_chrono -lboost_program_options) 

INSTALL(TARGETS myprog DESTINATION .) 
SET(CPACK_GENERATOR "TGZ") 
INCLUDE(CPack) 

Tutto compilare ed eseguire bene, ma di imballaggio (rendere pacchetto) pacchetto solo l'eseguibile e non il librerie Boost dipendenti ".so"

quando ho eseguito: ldd myprog mi dice che dipende da:. linux-vdso.so, libpthread.so, libboost_system.so, libboost_chrono.so, libboost_program_options.so libstdC++ così libgcc_s .so libc.so librt.so libm.so

Queste sono le librerie condivise che voglio impacchettare (forse non ho bisogno di imballare quelli standard)

Come posso dire cmake per afferrare le librerie di oggetti condivisi corrette e metterle accanto all'eseguibile in modo che l'utente debba solo decomprimere la cartella e avviare l'eseguibile senza alcuna installazione?

Il collegamento statico non è un'opzione, poiché avrò un sacco di eseguibili che utilizzeranno le stesse librerie di boost e potrebbero esserci anche problemi di licenza con il collegamento statico contro libgcc.

+0

Ho trovato uno script per copiare le dipendenze necessarie http://h3manth.com/content/copying-shared-library-dependencies Distribuito manualmente (mettendo così vicino all'eseguibile), ma il lancio non è facile. Per prima cosa dobbiamo rimuovere le dipendenze standard, quindi chmod 711 *, quindi impostare ld_library_path nella cartella in cui si trova l'applicazione e le librerie condivise. Nel programma finale viene eseguito ma non è facile da usare. Qualcuno può consigli per l'implementazione user-friendly? – darkblue

+1

Rispondendo parzialmente al mio commento, utilizzando set (CMAKE_EXE_LINKER_FLAGS "-Wl, -rpath = '$ ORIGIN'") sembra che non sia più necessario impostare ld_library_path Ho ancora bisogno di rimuovere linux-vdso.so, libpthread. quindi, libstdC++. so libgcc_s.so libc.so librt.so libm.so per farlo funzionare. Sebbene funzioni sulle mie macchine (ubuntu 12.04 e ubuntu 14.04), non sono sicuro che funzionerà con qualsiasi architettura Linux. – darkblue

+0

Sembra che anche il set di righe (CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) sia necessario in aggiunta al set (CMAKE_EXE_LINKER_FLAGS "-Wl, -rpath = '$ ORIGIN'") –

risposta