web-dev-qa-db-fra.com

Compiler un exécutable statique avec CMake

pour un projet, j'ai besoin de créer un exécutable qui inclut toutes les bibliothèques que j'ai utilisées (opencv, cgal) afin de l'exécuter sur un ordinateur qui n'a pas ces bibliothèques. Actuellement, c'est mon CMakeLists.txt (j'utilise linux).

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})

De cette manière, seul GMP et quelques autres bibliothèques c ++ sont inclus dans mon exécutable. Ma question est: comment puis-je créer un makefile afin d'inclure automatiquement toutes les bibliothèques de manière statique et de ne créer qu'un "gros" exécutable qui contient toutes les bibliothèques? Pouvez-vous m'aider?

16
Andrea

En tant que paramètres CMake globaux, ajoutez ces lignes avant add_executable, valide pour gcc/clang:

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

Sur CMake moderne (3.x + - doc target_link_libraries ), vous pouvez appliquer l'indicateur à des cibles spécifiques, de cette manière:

target_link_libraries(your_target_name -static)

Si vous utilisez [~ # ~] msvc [~ # ~] , vous devez définir les indicateurs du compilateur et de l'éditeur de liens:

target_compile_options(your_target_name PUBLIC/PRIVATE /MT)
target_link_options(your_target_name PUBLIC/PRIVATE /INCREMENTAL:NO /NODEFAULTLIB:MSVCRT)

et si vous utilisez MFC, vous devez spécifier l'indicateur sur 1voir ici :

 set(CMAKE_MFC_FLAG 1) 
28
madduci

Ajoutez ces lignes après add_executable(MyExec "main.c") (par exemple):

target_link_libraries(MyExec PUBLIC "-static")

ou avant: link_libraries("-static")

3
Logicae