为什么?在改变构建结构后,可执行文件的大小显著减少



我正在进行我的个人C++项目,该项目构建一个名为simplecc的简单编译器。今天,我触发了对它的重构,这改变了主可执行文件的构建方式,或者正如我所说,构建结构和可执行代码大小下降了近一半。

我的项目有许多组件,例如ASTCodeGen,它们以其功能命名。每个组件都驻留在自己的文件夹中(头文件和cpp的do)。有一个lib/目录保存所有其他组件的目录,lib/中的CMakeList.txt生成单个可执行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。

编辑:这些数据源自调试生成。我还没有完成版本构建(稍后将添加)。

由于main()中的某些组件被错误地省略而没有链接,代码大小缩小了。没有魔法或秘密。别再想办法了。

最新更新