【问题标题】:CMAKE, SDL2 and OPENGL: Program binary is too bigCMAKE、SDL2 和 OPENGL:程序二进制文件太大
【发布时间】:2015-05-26 01:02:28
【问题描述】:

我使用 CMAKE 将程序链接到 SDL2、OpenGL,并将 tinyxml2 编译为共享库。生成的程序二进制文件为 1.4 mb,但程序中只有 1k 行代码。我怀疑某些库是静态链接的。我希望它们作为共享库链接。我尝试使用以下方式打开和关闭调试符号:

cmake -DCMAKE_BUILD_TYPE=Debug .

然后关闭:

cmake .

生成的二进制文件仍然是每个 1.4 mb,这很奇怪,因为调试应该更大。这是我的 CMakeLists.txt:

project(ProjectName)
cmake_minimum_required(VERSION 2.8)

set(CMAKE_CXX_FLAGS "-Wall -std=c++11")
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake-find-scripts")

aux_source_directory(. SRC_ROOT)
aux_source_directory(./extlib SRC_EXTLIB)
aux_source_directory(./engine SRC_ENGINE)
aux_source_directory(./utils SRC_UTILS)

include_directories(./extlib)
include_directories(./engine)
include_directories(./utils)
include_directories(${SDL2_INCLUDE_DIR})
include_directories(${OPENGL_INCLUDE_DIRS})

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR})
set(LONE_HEADERS ./engine/stc_config.h)
add_executable(${PROJECT_NAME} ${SRC_ROOT} ${SRC_ENGINE} ${SRC_UTILS} ${LONE_HEADERS})

find_package(SDL2 REQUIRED)
find_package(SDL2IMAGE REQUIRED)
find_package(OpenGL REQUIRED)

add_library(tinyxml2 SHARED ./extlib/tinyxml2.cpp)

target_link_libraries(${PROJECT_NAME} ${SDL2_LIBRARIES} ${OPENGL_LIBRARIES} ${SDL2IMAGE_LIBRARIES} tinyxml2)

编辑:我已经使用ldd 命令检查了二进制文件与哪些库文件链接,并且输出确认它们都是共享库:

    linux-vdso.so.1 (0x00007fff9dbf0000)
    libSDL2-2.0.so.0 => /usr/lib/libSDL2-2.0.so.0 (0x00007f3accff7000)
    libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f3accdda000)
    libGLU.so.1 => /usr/lib/libGLU.so.1 (0x00007f3accb59000)
    libGL.so.1 => /usr/lib/libGL.so.1 (0x00007f3acc7fb000)
    libSDL2_image-2.0.so.0 => /usr/lib/libSDL2_image-2.0.so.0 (0x00007f3acc5d5000)
    libtinyxml2.so => /home/hacow/OGLTEST/libtinyxml2.so (0x00007f3acc3bd000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f3acc0ae000)
    libm.so.6 => /usr/lib/libm.so.6 (0x00007f3acbda9000)
    libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f3acbb93000)
    libc.so.6 => /usr/lib/libc.so.6 (0x00007f3acb7f0000)
    libdl.so.2 => /usr/lib/libdl.so.2 (0x00007f3acb5ec000)
    librt.so.1 => /usr/lib/librt.so.1 (0x00007f3acb3e4000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f3acd2fa000)
    libnvidia-tls.so.349.16 => /usr/lib/libnvidia-tls.so.349.16 (0x00007f3acb1e1000)
    libnvidia-glcore.so.349.16 => /usr/lib/libnvidia-glcore.so.349.16 (0x00007f3ac8472000)
    libX11.so.6 => /usr/lib/libX11.so.6 (0x00007f3ac8130000)
    libXext.so.6 => /usr/lib/libXext.so.6 (0x00007f3ac7f1e000)
    libxcb.so.1 => /usr/lib/libxcb.so.1 (0x00007f3ac7cfc000)
    libXau.so.6 => /usr/lib/libXau.so.6 (0x00007f3ac7af8000)
    libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x00007f3ac78f2000)

【问题讨论】:

  • 您是否尝试在没有调试信息/符号的情况下构建它?
  • @RedAgito 是的,调试和非调试生成的二进制文件各为 1.4 mb。但调试版本应该更大。
  • 您正在链接各个库的非调试版本?
  • 查找脚本中没有提到调试版本。
  • 您可能正在链接包含调试信息的库版本。否则我不知道编辑:它可能是来自模板等的代码膨胀,但 1.4 mb 有点多

标签: c++ cmake shared-libraries static-libraries sdl-2


【解决方案1】:

使用cmake . 构建与该目录中的最新构建使用相同的CMAKE_BUILD_TYPE。使用cmake -DCMAKE_BUILD_TYPE=Release . 在发布模式下构建。如果您先构建调试然后发布,使用您描述的过程,它只会重新构建您的调试二进制文件。

【讨论】:

  • 感谢它解决了这个问题。对于 cmake 而言,这是一种奇怪的行为并且令人困惑,但毕竟关于 cmake 的许多事情都令人困惑。
猜你喜欢
  • 1970-01-01
  • 2019-10-06
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多