使用CMAKE编译静态可执行文件
我正在尝试构建静态可执行文件,但没有成功构建。在添加以下行之前它工作正常:使用CMAKE编译静态可执行文件
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的采摘动态库在静态归档问题,请尝试find命令上面加了这对您的CMakeLists.txt:
set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
最后但并非最不重要的,提醒清除您的cmake缓存,使其不挂在libGLU.so
上。
是的,我可以在我的系统上找到libGLU.a。我尝试添加上面提到的行,但仍然出现相同的错误。 我没有完全理解缓存部分。我如何确保清除它? –
找到'CMakeCache.txt'并将其删除。这将消除构建中的任何缓存的cmake变量,然后重新运行cmake以重新生成。 –
我做到了。我添加了下面的代码并编译完成。但它仍然不是静态的,因为我不能在其他没有库的linux上运行输出文件。 (CMAKE_EXE_LINKER_FLAGS“-static-libgcc -static-libstdC++”) 更新了问题。 –