【问题标题】:Why? Executable size cuts dramatically after changing build structure为什么?更改构建结构后,可执行文件大小显着减小
【发布时间】:2019-01-24 05:11:08
【问题描述】:

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

我的项目有很多组件,例如ASTCodeGen,它们都是以其功能命名的。每个组件都驻留在自己的文件夹中(标题和 cpp 都有)。有一个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

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

【问题讨论】:

  • 这些尺寸是否适合发布(优化)构建?我不希望名称中带有“简单”的东西会产生 14 mb 的可执行文件
  • @VTT 不,它用于调试。
  • 在实际运行可执行文件之前不要抱太大希望。确保您的构建确实正常工作。
  • 对不起各位!当我看到@PaulMcKenzie 的评论时,我运行了该程序,但它没有响应某些开关。事实证明,一些宏定义是在应该使用的点之后定义的。结果 main() 不使用某些组件,因此它们没有链接。误报。当我修复这个问题时,代码大小恢复到 12M。

标签: c++ build code-size


【解决方案1】:

代码大小缩小了,因为一些组件被错误地从main() 中省略并且没有链接进去。没有魔法或秘密。不要再想办法了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 2010-09-17
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多