Зачем? Размер исполняемого файла значительно уменьшается после изменения структуры сборки

Я нахожусь в моем личном проекте C++, который строит простой компилятор, названный simplecc. Сегодня я запустил на нем рефакторинг, который изменил способ сборки основного исполняемого файла, или, как я это назвал, структура сборки и размер исполняемого кода упали почти вдвое.

Мой проект имеет много компонентов, таких как AST а также CodeGen, которые названы в честь их функциональности. Каждый компонент находится в своей собственной папке (как заголовки, так и файлы cpp). E сть lib/ каталог, который содержит каталоги для всех других компонентов и CMakeList.txt в lib/ генерирует один исполняемый файл simplecc, Теперь вот разница.

Старый код:

# All source code is listed and directly built into the executable.
add_executable(simplecc
        Lex/Tokenize.cpp
        Lex/TokenInfo.cpp

        Parse/Grammar.cpp
        Parse/ASTBuilder.cpp
        Parse/Parser.cpp
        Parse/Node.cpp
        Parse/Parse.cpp
        Parse/ParseTreePrinter.cpp

        # More to come...
)

Новый код:

# lib/CMakeLists.txt
add_subdirectory(Lex)
add_subdirectory(Parse)
# More to come...

# Add main executable.
add_executable(simplecc Driver/main.cpp)

# Link to all components.
target_link_libraries(simplecc Driver)
# More to come.


# lib/Parse/CMakeLists.txt
add_library(Parse STATIC
        ASTBuilder.cpp
        Grammar.cpp
        Node.cpp
        Parse.cpp
        Parser.cpp
        ParseTreePrinter.cpp)

target_link_libraries(Parse Lex AST)

и внутри каждого подкаталога из источника этого компонента создается статическая библиотека (архив). Наконец эти архивы связаны в исполняемый файл.

Хотя я думаю, что я просто организовал код так, чтобы он лучше отслеживался cmake, это резко сократило размер кода исполняемого файла! Старый код - 14M и 3,7M после удаления. Новый код - 2.4M, после чего - 5.6M и 560K - после удаления. Как это может случиться? Это вообще правда? Это конкретный проект? Мой проект широко использует CRTP.

Изменить: эти данные получены из сборки отладки. Я не выполнил сборку релиза (будет добавлено позже).

1 ответ

Размер кода уменьшается, потому что некоторые компоненты по ошибке опущены main() и не связаны. Никакой магии или секрета. Не пытайтесь выяснить больше.

Другие вопросы по тегам