C语言:主.obj文件(和可执行文件)大小接近400MB

C language: main .obj file (and executable) is nearly 400MB in size

依赖关系:

编译器:GCC 11.2.0 (MinGW-W64)
CMake 3.23.1
GNU Make 4.3

问题

main.c(和可执行文件)的 .obj 文件大小接近 400MB
生成的 .obj 文件:https://i.stack.imgur.com/Dgn51.png

肯定是 main.c 文件 and/or 我包含依赖项 headers 的方式有问题,但我无法弄清楚。

来源

可以在这个 github repo https://github.com/kvbc/maincraft

找到完整的源代码

main.c

#include "mc.h"

#define GLFW_INCLUDE_NONE
#include <GLFW/glfw3.h>

#include <stdio.h>
#include <stdlib.h>

mc.h

#ifndef MC_H
#define MC_H

#include <glad/glad.h>
#include <cglm/cglm.h>
#include <stb_image.h>

#include <stdio.h>
#include <stdint.h>
#include <stdarg.h>
#include <stddef.h>
#include <string.h>
#include <assert.h>

#include "config.h"

建筑

我正在使用 CMake 和 Make 将 GLFW 和 CGLM 构建为静态库,并将我的程序构建为可执行文件。
据我所知,构建前两个没有问题,但我是这样做的

cmake -S lib/glfw-3.3.7 -B build/glfw -G "MinGW Makefiles" -DBUILD_SHARED_LIBS=OFF -DGLFW_BUILD_EXAMPLES=OFF -DGLFW_BUILD_TESTS=OFF -DGLFW_BUILD_DOCS=OFF
make -C build/glfw
:: CGLM
cmake -S lib/cglm-0.8.5 -B build/cglm -G "MinGW Makefiles" -DCGLM_SHARED=OFF -DCGLM_STATIC=ON -DCGLM_USE_C99=OFF -DCGLM_USE_TEST=OFF
make -C build/cglm

现在,关于构建我的代码 (CMakeLists.txt)

cmake_minimum_required(VERSION 3.8.2)

project(maincraft)

set(CMAKE_C_FLAGS "-O3 -s -DNDEBUG -Wall -Wextra")

include_directories(lib/glfw-3.3.7/include)
include_directories(lib/cglm-0.8.5/include)
include_directories(lib/glad-4.0-core/include)
include_directories(lib/stb_image-2.2.7/include)

link_directories(build/glfw/src)
link_directories(build/cglm)

add_executable(${PROJECT_NAME}
    lib/stb_image-2.2.7/src/stb_image.c
    lib/glad-4.0-core/src/glad.c
    src/file.c
    src/main.c
    src/program.c
    src/camera.c
    src/world.c
    src/tex.c
    src/math.c
    src/text.c
)

target_link_libraries(${PROJECT_NAME} glfw3)
target_link_libraries(${PROJECT_NAME} cglm)

stb_image.c 文件只是一个包含

的定义
#define STB_IMAGE_IMPLEMENTATION
#include <stb_image.h>

main.c 文件中,您有全局变量 G,这是一个包含许多其他结构的结构。

除其他外,G 结构有一个名为 world 的成员,它是一个 mc_World 结构。

mc_World 结构有一个包含 10000000 个元素的数组,每个元素都是一个 mc_Block 结构。

mc_Block 结构至少有 32 个字节大。

mc_World 数组 block 将占用至少 32 * 10000000 字节,即略低于 320 MiB!

作为全局范围内的数组(间接),它将存在于目标文件和可执行文件中。

也许您应该考虑对该数组进行动态分配?这也将使拥有不同大小的世界变得更容易。