使用CMAKE编译静态可执行文件

时间:2016-11-15 19:47:44

标签: linux c++11 cmake static-libraries static-linking

我正在尝试构建静态可执行文件但是没有成功构建。在添加以下行之前,它工作正常:

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

我想将其转换为静态可执行文件。有任何帮助或建议吗?

这是我的cmake代码:

cmake_minimum_required(VERSION 3.5)

set(CMAKE_CXX_STANDARD 11)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -g -Werror -lpthread")
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
SET(BUILD_SHARED_LIBRARIES OFF)
SET(CMAKE_EXE_LINKER_FLAGS "-static")


add_executable(${PROJECT_NAME} MACOSX_BUNDLE
                               main.cc
                               audiofile.cc
                               button.cc
                               entity.cc
                               entity_group.cc
                               filter.cc
                               splash_screen_state.cc
                               sprite.cc
                               signal.cc
                               signal_chunk.cc
                               sound_edit_state.cc
                               splash_screen_state.cc
                               sprite.cc
                               state.cc
                               state_stack.cc
                               waveform_chunk_display.cc
                               waveform_chunk_select_button.cc
                               waveform_chunk_select_display.cc
                               waveform_component_display.cc
                               waveform_display.cc
                               wwest_app.cc
                               play_original_button.cc
                               low_pass_button.cc
                               high_pass_button.cc
                               mid_pass_button.cc
                               reset_button.cc
                               play_modified_button.cc
                               speed_up_button.cc
                               slow_down_button.cc)

find_package(PkgConfig REQUIRED)
pkg_search_module(SDL2 REQUIRED sdl2)
pkg_search_module(SDL2_IMAGE REQUIRED SDL2_image>=2.0.0)
pkg_search_module(SDL2_TTF REQUIRED SDL2_ttf)
pkg_search_module(NFD REQUIRED sdl2)
find_package(OpenGL REQUIRED)

include_directories(${SDL2_INCLUDE_DIRS}
                    ${SDL2_IMAGE_INCLUDE_DIR}
                    ${SDL2_TTF_INCLUDE_DIR}
                    ${OPENGL_INCLUDE_DIRS}
                ${NFD_INCLUDE_DIRS}
                ${GTK3_INCLUDE_DIRS})

pkg_check_modules(GTK3 REQUIRED gtk+-3.0)
link_directories(${GTK3_LIBRARY_DIRS})
add_definitions(${GTK3_CFLAGS_OTHER})

target_link_libraries(${PROJECT_NAME} ${SDL2_LIBRARIES}
                                      ${SDL2_IMAGE_LIBRARIES}
                                      ${SDL2_TTF_LIBRARIES}
                                      ${OPENGL_LIBRARIES}
                                      ${NFD_LIBRARIES} 
                                      ${GTK3_LIBRARIES} 
                                      nfd
                                      pthread)

我尝试合并链接中的步骤,但无法正常工作并收到以下错误:

  

/ usr / bin / ld:动态对象`/usr/lib/x86_64-linux-gnu/libGLU.so'的静态链接   collect2:错误:ld返回1退出状态   src / CMakeFiles / wwest-outreach-app.out.dir / build.make:774:目标'bin / wwest-outreach-app.out'的配方失败   make [2]: * [bin / wwest-outreach-app.out]错误1   CMakeFiles / Makefile2:85:目标'src / CMakeFiles / wwest-outreach-app.out.dir / all'的配方失败   make [1]:* [src / CMakeFiles / wwest-outreach-app.out.dir / all]错误2   Makefile:83:目标'all'的配方失败   make:*** [all]错误2

以下是我尝试过的链接: Compiling a static executable with CMake

注意:我添加了以下行并编译但不是静态的,因为我仍然无法打开其他Linux机器上的输出文件(.out)。

set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")

1 个答案:

答案 0 :(得分:0)

您可以在系统上找到libGLU.a吗?链接器无法将动态库(libGLU.so)链接到静态构建的程序。

如果您可以在系统上找到libGLU.a,请确保它在CMAKE_LIBRARY_PATH中可用。

如果你/仍然/有问题,cmake通过静态存档选择动态库,请尝试将其添加到find命令上方的CMakeLists.txt:

set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})

最后但并非最不重要的是,提醒您清除您的cmake缓存,使其不会挂在libGLU.so上。