C语言:主.obj文件(和可执行文件)大小接近400MB
C language: main .obj file (and executable) is nearly 400MB in size
依赖关系:
- GLFW 3.3.7
- GLAD 4.0 内核
- CGLM 0.8.5
- stb_image2.2.7
编译器: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!
作为全局范围内的数组(间接),它将存在于目标文件和可执行文件中。
也许您应该考虑对该数组进行动态分配?这也将使拥有不同大小的世界变得更容易。
依赖关系:
- GLFW 3.3.7
- GLAD 4.0 内核
- CGLM 0.8.5
- stb_image2.2.7
编译器: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!
作为全局范围内的数组(间接),它将存在于目标文件和可执行文件中。
也许您应该考虑对该数组进行动态分配?这也将使拥有不同大小的世界变得更容易。