为什么?更改构建结构后,可执行文件的大小会急剧减少

时间:2019-01-24 05:11:08

标签: c++ build code-size

我正在我的个人C ++项目中,该项目构建了一个简单的编译器,称为simplecc。今天,我触发了重构,从而改变了主要可执行文件的构建方式,或者正如我所说的那样,构建结构和可执行代码的大小减少了近一半。

我的项目有许多组件,例如ASTCodeGen,它们以其功能命名。每个组件都位于其自己的文件夹中(标头和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

编辑:这些数据来自调试版本。我还没有完成发布版本(稍后会添加)。

1 个答案:

答案 0 :(得分:0)

缩小代码大小是因为错误地从tab-nav-bar-basic-example.html中省略了某些组件并且没有将它们链接进来。没有魔术或秘密。不要再想办法了。