Я работаю над своим личным проектом C ++, который создает простой компилятор, который называется simplecc . Сегодня я запустил на нем рефакторинг, который изменил способ сборки основного исполняемого файла, или, как я это назвал, структура сборки и размер исполняемого кода упали почти вдвое.
В моем проекте много компонентов, таких как AST
и CodeGen
, которые названы в честь своих функциональных возможностей. Каждый компонент находится в своей собственной папке (как заголовки, так и файлы cpp). Существует каталог 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 .
Редактировать : эти данные получены из сборки Debug. Я не выполнил сборку релиза (будет добавлено позже).