2014-07-09 13 views
9

dla projektu Potrzebuję utworzyć plik wykonywalny, który zawiera wszystkie biblioteki, których użyłem (opencv, cgal), aby wykonać go na komputerze, który nie ma tych bibliotek. Obecnie jest to mój CMakeLists.txt (używam Linuksa).Kompilowanie statycznego pliku wykonywalnego z 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}) 

W ten sposób tylko GMP i niektóre inne biblioteki C++ są zawarte w moim pliku wykonywalnym. Moje pytanie brzmi: Jak mogę utworzyć plik Makefile, aby automatycznie włączyć wszystkie biblioteki w sposób statyczny i utworzyć tylko "duży" plik wykonywalny, który zawiera wszystkie biblioteki? Możesz mi pomóc?

+0

Nie należy korzystać z pliku '(...)' GLOB zebrać pliki źródłowe nie będzie działać poprawnie podczas dodawania nowych plików. Jest również bardzo niejasne, jaki jest twój problem. Wywołania 'add_library (IMPORTOWANE)' również niczego nie robią. – pmr

+0

Potrzebuję utworzyć plik wykonywalny, który zawiera wszystkie biblioteki (opencv, cgal i wszystkie popularne biblioteki C++), aby wykonać plik wykonywalny na innym komputerze, na którym nie zainstalowano Opencv, CGAL lub innych bibliotek C++. – Andrea

+0

Najpierw musisz upewnić się, że wszystkie biblioteki, na których polegasz, są zbudowane statycznie. Często tak nie jest. Po tym musisz upewnić się, że twoje wywołania 'find_package' znajdują te statyczne biblioteki. – pmr

Odpowiedz

16

dodać te linie przed add_executable:

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

EDIT

Na Nowoczesnej CMake 3.x (+), można nawet użyć:

set_target_properties(your_target_name PROPERTIES LINK_FLAGS "-static") 
0

Dodaj te linie po add_executable(MyExec "main.c") (na przykład):

target_link_libraries(MyExec PUBLIC "-static")

lub wcześniej: link_libraries("-static")

Powiązane problemy