Зачем? Размер исполняемого файла значительно уменьшается после изменения структуры сборки - PullRequest
0 голосов
/ 24 января 2019

Я работаю над своим личным проектом 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. Я не выполнил сборку релиза (будет добавлено позже).

1 Ответ

0 голосов
/ 24 января 2019

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

...