web-dev-qa-db-ja.com

静的実行可能ファイルをCMakeでコンパイルする

プロジェクトの場合、使用したすべてのライブラリ(opencv、cgal)を含む実行可能ファイルを作成して、それらのライブラリを持たないコンピューターで実行する必要があります。現在、これは私のCMakeLists.txtです(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})

このようにして、GMPと他のc ++ライブラリのみが実行可能ファイルに含まれます。私の質問は次のとおりです。すべてのライブラリを静的な方法で自動的に含め、すべてのライブラリを含む「大きな」実行可能ファイルのみを作成するには、メイクファイルを作成するにはどうすればよいですか。手伝って頂けますか?

16
Andrea

グローバルCMake設定として、gcc/clangに有効なadd_executableの前に次の行を追加します。

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

Modern CMake(3.x +- target_link_libraries doc )では、この方法で特定のターゲットにフラグを適用できます:

target_link_libraries(your_target_name -static)

[〜#〜] msvc [〜#〜]を使用している場合、コンパイラとリンカーのフラグを設定する必要があります。

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

mFCを使用している場合は、1にフラグを指定する必要があります こちらを参照

 set(CMAKE_MFC_FLAG 1) 
28
madduci

add_executable(MyExec "main.c")の後にこれらの行を追加します(例):

target_link_libraries(MyExec PUBLIC "-static")

以前:link_libraries("-static")

3
Logicae