链接器中不必要的链接库

时间:2011-01-09 13:29:54

标签: c++ linker

我有一个项目,我可以从链接器中排除一些库并仍然构建?

根据最终产品的性能和记忆排除它们会更好吗?

4 个答案:

答案 0 :(得分:4)

一个好的c ++链接器不会包含来自代码中未使用的任何lib的任何调用(所谓的“代码剥离”)。

所以,我会说这取决于您使用什么样的C ++链接器来发布最终版本。也许你应该参考你的链接器文档来获取有关死代码剥离的信息。如果它不这样做,那肯定会有助于减少程序的最终内存占用。

干杯,希望信息有所帮助!

答案 1 :(得分:2)

从最终的可执行文件中排除一些未使用的库可能会使启动速度更快并节省微小的内存量 - 很可能只有头和库启动代码实际上最终会被加载,这些可以在启动后分页。

但是,请勿手动执行此操作。如果你被告知添加库可能有一个原因 - 也许某些函数调用你不使用但是需要它,如果你使用那个函数调用,你可能会忘记它

大多数链接器都可以选择自动排除未使用的库,因此您可能只想启用该选项,让它为您处理事情。

注意:在极少数情况下,库的启动代码可能会产生一些重要影响,在这种情况下,您不应将其排除。这是通过检查图书馆的文档最好的决定;这样的事情(希望!)应该清楚地记录下来。

答案 2 :(得分:1)

它应该没有任何区别。

任何有价值的链接器都不会包含应用程序未(直接或间接)引用的库中的任何内容,即使这些库是在命令行中指定的。 包含(部分)库的唯一理由是: - 应用程序使用库中的函数或全局对象 - 为解析某些引用而包含的库的一部分引用了该库的函数或全局对象。

链接器不只是盲目地将您提供的所有内容放在一起放在应用程序中,而是区分目标文件(对于应用程序)和库。
链接器首先收集所有目标文件,并解析文件之间的多个引用 之后,链接器遍历指定的库,并从每个库中获取解析(已知)未解析引用所需的那些部分。由于库之间的依赖性,这可能会创建新的未解析引用。大多数链接器只会对库进行一次传递,但有些链接器可能会执行多次传递来解析所有引用。 解析引用所不需要的库部分不包含在可执行文件中。

答案 3 :(得分:-1)

是的,排除不必要的库总是更好。