Зачем? Размер исполняемого файла значительно уменьшается после изменения структуры сборки
Я нахожусь в моем личном проекте 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()
и не связаны. Никакой магии или секрета. Не пытайтесь выяснить больше.