Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

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

Dependencies:

  • GLFW 3.3.7
  • GLAD 4.0 core
  • CGLM 0.8.5
  • stb_image 2.2.7

Compiler: GCC 11.2.0 (MinGW-W64)
CMake 3.23.1
GNU Make 4.3

Problem

The .obj file for main.c (and executable) is nearly 400MB in size
Generated .obj files: https://i.stack.imgur.com/Dgn51.png

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

There must something wrong with the main.c file and/or the way I include my dependency headers, but I can’t figure it out.

Source

The full source can be found at this 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"

Building

I’m using CMake and Make to build GLFW and CGLM as static libraries and my program into an executable.
As far as I’m aware there’s no problem with building the first two, but here is how I do it

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

Now, as for building my code (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)

The stb_image.c file is just a define with an include

#define STB_IMAGE_IMPLEMENTATION
#include <stb_image.h>

>Solution :

In the main.c file you have the global variable G, which is a structure containing many other structures.

Among other things the G structure have a member named world which is a mc_World structure.

The mc_World structure have an array of 10000000 elements, each element being a mc_Block structure.

The mc_Block structure is at least 32 bytes large.

The mc_World array block will take up at least 32 * 10000000 bytes, i.e. just a little under 320 MiB!

As an array (indirectly) in the global scope it will exist in the object file, and in the executable file.

Perhaps you should consider dynamic allocation for this array? That will also make it easier to have a world of different sizes.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading