2014-07-09 12 views
9

per un progetto Devo creare un eseguibile che includa tutte le librerie che ho usato (opencv, cgal) per eseguirlo su un computer che non ha quelle librerie. Attualmente, questo è il mio CMakeLists.txt (io uso linux).Compilare un eseguibile statico con CMake

cmake_minimum_required(VERSION 2.8) 
#set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall") 
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall -O2") 
project(labeling) 
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") 
add_library(OpenCV STATIC IMPORTED) 
add_library(CGAL STATIC IMPORTED COMPONENTS Core) 
add_library(GMP STATIC IMPORTED) 
find_package(OpenCV REQUIRED) 
find_package(CGAL QUIET COMPONENTS Core) 
find_library(GMP_LIBRARY gmp /usr/lib) 

include(src) 
include(${CGAL_USE_FILE}) 
include(CGAL_CreateSingleSourceCGALProgram) 


set(EXECUTABLE_OUTPUT_PATH ../bin) 
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++") 

include_directories(src) 
include_directories(${OpenCV_INCLUDE_DIRS}) 

file(GLOB_RECURSE nei_SRC "src/*.cpp") 
add_executable(nei_segmentation ${nei_SRC}) 
target_link_libraries(nei_segmentation ${OpenCV_LIBS} ${GMP_LIBRARY}) 

In tal modo solo GMP e alcune altre librerie C++ sono incluse nel mio eseguibile. La mia domanda è: come posso creare un makefile per includere automaticamente tutte le librerie in modo statico e creare solo un "grande" eseguibile che contenga tutte le librerie? Mi potete aiutare?

+0

Non si deve usare file '(GLOB ...)' per raccogliere file di origine che non funziona correttamente quando si aggiungono nuovi file. Inoltre, non è chiaro quale sia il tuo problema. Anche le chiamate 'add_library (IMPORTED)' non stanno facendo nulla. – pmr

+0

Ho bisogno di creare un eseguibile che includa tutte le librerie (opencv, cgal e tutte le librerie C++ comuni) per eseguire l'eseguibile su un altro computer dove Opencv o CGAL o altre librerie C++ non sono installate. – Andrea

+0

Per prima cosa è necessario assicurarsi che tutte le librerie da cui si dipende siano costruite staticamente. Questo spesso non è il caso. Dopodiché è necessario assicurarsi che le chiamate 'find_package' trovino quelle librerie statiche. – pmr

risposta

16

aggiungere queste righe prima add_executable:

SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a") 
SET(BUILD_SHARED_LIBRARIES OFF) 
SET(CMAKE_EXE_LINKER_FLAGS "-static") 

EDIT

On CMake moderna (3.x +), si può anche utilizzare:

set_target_properties(your_target_name PROPERTIES LINK_FLAGS "-static") 
0

aggiungere queste righe dopo add_executable(MyExec "main.c") (ad esempio):

target_link_libraries(MyExec PUBLIC "-static")

o prima: link_libraries("-static")