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

标签 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: attempted static link of dynamic object `/usr/lib/x86_64-linux-gnu/libGLU.so' collect2: error: ld returned 1 exit status src/CMakeFiles/wwest-outreach-app.out.dir/build.make:774: recipe for target 'bin/wwest-outreach-app.out' failed make[2]: * [bin/wwest-outreach-app.out] Error 1 CMakeFiles/Makefile2:85: recipe for target 'src/CMakeFiles/wwest-outreach-app.out.dir/all' failed make[1]: * [src/CMakeFiles/wwest-outreach-app.out.dir/all] Error 2 Makefile:83: recipe for target 'all' failed make: *** [all] Error 2

这是我试过的链接: Compiling a static executable with CMake

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

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

最佳答案

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

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

如果您/仍然/在 cmake 从静态存档中选择动态库时遇到问题,请尝试将其添加到您的 CMakeLists.txt 中查找命令上方:

set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})

最后但同样重要的是,提醒您清除您的 cmake 缓存,这样它就不会卡在 libGLU.so 上。

关于linux - 使用 CMAKE 编译静态可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40618443/

相关文章:

c++ - std::stoi、std::setbase 和 std::out_of_range 错误

python - 在python中使用 "using std::vector"时SWIG参数错误

c++11 - CMake 3.10与Visual Studio 2015、2017完全不兼容

c++ - CMake:为目标源设置目录

cmake目录问题

linux - 如何在行尾负 1 位置添加带有 sed 的文本

c - 使用 setrlimit() 设置堆栈大小并引发堆栈溢出/段错误

c++ - 掩码设置为 0 时不生成核心文件

java - 如何使用 Java 凭据连接到网络驱动器?

C++11 类型的(有符号 + 无符号)?