当前位置: 首页 > 知识库问答 >
问题:

用CMAKE编译静态可执行文件

云星波
2023-03-14
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-export-app.out.dir/build.make:774:recipe for targe'bin/wwest-export-app.out.dir‘失败make[2]:*[bin/wwest-export-app.out’错误1 cmakefiles/makefile2:85:recipe for'all'生成失败:***[all]错误2

下面是我尝试的链接:用CMake编译静态可执行文件

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

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

共有1个答案

乌翰学
2023-03-14

您能在系统上找到libglu.a吗?链接器无法将动态库(libglu.so)链接到静态生成的程序。

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

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

set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
 类似资料:
  • 问题内容: 我有一个纯Python脚本,我想分发给具有未知Python配置的系统。因此,我想将Python代码编译为独立的可执行文件。 我奔波没有问题。那我跑 哪里给 并给 通过这种方式,我可以获得一个动态链接的可执行文件,该文件可以正常运行。产量 现在,我尝试将选项添加到gcc,但这会导致错误: 我检查了ldd给定的所有共享库是否也都安装为静态库。 那么,这与python3-config提供的选

  • 我们检查一下PHP语言中get_loaded_extensions()函数的输出,会发现有一些扩展并没有php.ini文件中调用,而它们确实也已经加载到PHP里去了,可以让我们在PHP语言中使用,如standard、Reflection、Core等。它们便是静态编译的,它们没有被编译成so或者dll文件供PHP动态调用,而是直接和PHP主程序编译到一起。 在*nix上执行静态编译 现在,先让我们执

  • 问题内容: 在kivy论坛中没有得到回应,因此请在这里尝试。 当我将教程pong代码编译为一个文件可执行文件时,我仍然必须将pong.kv文件包含在同一文件夹中才能运行。否则,启动exe时出现以下错误: 如何使它作为一个可执行文件运行。这是我的pong.spec文件: 请注意,我尝试将pong.kv包括在数据列表中,但这没有帮助。 谢谢,-Raj 问题答案: 根据KeyWeeUsr提供的链接(将数

  • 问题内容: 有没有办法查看在* nix中使用了哪些编译器和标志来创建可执行文件?我已经编译了一个旧版本的代码,我想看看它是经过优化还是未经优化而编译的。Google并没有太大的帮助,但是我不确定我使用的关键字是否正确。 问题答案: gcc 为此提供了一个选项: 之后,ELF可执行文件将包含带有该信息的部分。 当然,如果没有该选项编译的可执行文件将无法使用。 对于简单的优化情况,如果文件是使用调试信

  • 问题内容: 我刚刚使用Eclipse编写了一个简单程序,并且想将其编译为可执行文件,但似乎根本找不到如何执行的方法。 问题答案: 你可以通过以下方式将.jar文件转换为.exe: 1- JSmooth .exe包装器: JSmooth是Java可执行包装器。它为Java应用程序创建本机Windows启动器(标准.exe)。由于它能够自行查找任何已安装的Java VM,因此它使Java部署更加流畅和

  • 问题内容: 我爱得如此之多的两件事通常并不会引起我那么多的烦恼(除了我的孩子们)。我已经在工作中编写了一个Haskell程序,该程序使用诸如文本,xml- enumerator,attoparsec-text等库。我在Windows计算机,Ubuntu虚拟机(32位), Ubuntu桌面(再次为32位)和运行Ubuntu(64位)的EC2实例。 我们的客户端正在运行64位CentOS 5.3。我无