通过仅选择所需的功能并消除不必要的文件来减少库大小的更简单方法是什么? 是否有一个脚本来完成c ++库的这个任务?
答案 0 :(得分:2)
您可能应首先尝试设置编译以最小化大小。你的问题的答案很大程度上取决于编译器,链接器,操作系统,优化标志等......
在Linux上使用最新的GCC编译器(g++
),您应该尝试编译并链接以优化大小(-Os
)和{{ 3}}(-flto
)。
所以放
CXX=g++ -flto -Os
在Makefile
的开头附近,或者只是在make CXX='g++ -flto -Os'
之后运行make clean
BTW,link time optimization也知道-flto
(并像GCC一样使用Clang/LLVM)
请注意,共享的GOLD(或者可能是Microsoft世界中的DLL)需要包含所有代码(正是因为它在多个进程和程序之间共享)。您可以静态链接库(然后在构建静态库时以及将其链接到主程序时使用g++ -flto -Os
)
通常,拥有共享库比尝试减少空间更有价值。
如果在Linux上,请阅读library。
答案 1 :(得分:1)
在典型的C ++应用程序中,模板代表了很大一部分功能(例如STL vector
,string
等)。这些函数仅在使用时作为代码生成(尽管它们可能生成为内联函数,在某些情况下会导致大代码)。
链接器只会“选择”应用程序所需的代码(当然包括您使用的函数调用的函数)。但是,例如Linux上的基本运行时非常大,因为它调用了许多功能,而这些功能又使用了相当多的其他功能 - 因此您的基本可执行文件大小非常大。在典型情况下,添加更多自己的代码不会大幅增加大小。
如果大小很重要,那么使用“小C ++库”可能是一种选择 - 不同的操作系统可以使用不同的库。使用诸如-Os
之类的选项让编译器告诉它“使代码变小”(换句话说,除非通过内联而不是通过调用函数来缩短代码,否则不要内联函数,并且不要展开循环等等 - 但DO内联函数只调用一次,因为这会使代码更短)
答案 2 :(得分:0)
如果你不想做一个重度重构的库(假设你可以访问源代码并不总是一个现实的小说),那就是将它作为静态库链接,或者作为你应用程序的一部分进行编译:所有编译器将从中受益。
请注意,Clang具有异常行为,因为与其他编译器相比,它能够在静态链接时进行大量优化。
如果您出于某种原因不得不使用DLL,则可以尝试调整导出符号的可见性(您可以隐藏客户端代码中不可见的符号并仅导出您使用的符号):请注意,这可能会使某些优化更加重要速度和二进制大小,但可能是一项繁琐的工作(我认为它是一个重大的重构,因为有可能破坏事物)。
如果您正在使用依赖注入容器,您可以检测它们以警告未使用的依赖项,以便您可以轻松地将它们连接起来,而无需触及源代码(您对容器进行了一些重构,而不是对整个代码库进行重构) )除了组合根中的源代码。