【问题标题】:Can I find out which libraries that I have included in my C program are actually used?我可以找出我的 C 程序中包含的哪些库实际上被使用了吗?
【发布时间】:2012-07-31 15:13:20
【问题描述】:

我的 C 程序中有大量包含。在开发过程中,我尝试了不同的做事方式,所以我敢打赌,我已经包含了一些库,但没有使用。

编译器是否会删除不使用的库?有什么工具可以告诉我吗?即使编译器确实摆脱了代码,如果我可以摆脱一些东西,它也会整理源代码。

【问题讨论】:

  • 通常标准库中的#includes 只提供原型和声明,即所有仅在编译时存在的东西,所以我想它们可能只是在减慢编译速度;尽管如此,从不必要的包含中清理源肯定是一件好事。
  • 您使用的是哪个工具链?编译器不会删除死代码,但链接器可以。

标签: c


【解决方案1】:

实际上决定什么最终进入可执行文件的不是编译器,而是链接器。现代链接器足够聪明,除非使用代码,否则不会从库中提取代码。因此,您可以链接到数百个库,但如果您不调用其中的任何函数,那么它们不会向您的程序添加任何代码。

至于头文件,大多数只包含声明和预处理器宏,它们不会自己添加代码。包含许多头文件的最大缺点是它会减慢源文件的编译速度。

【讨论】:

    【解决方案2】:

    不,该工具集将链接到您告诉它链接的任何库。您可以通过 Doxygen 等工具运行您的源代码,该工具将生成有关您的代码如何使用的文档页面和图表,但它赢了不一定会告诉您您是否正确或有效地使用了图书馆。

    由程序员决定是否需要该库并仔细选择执行程序所需的库。不必要的包含会增加编译时间,并可能导致二进制文件膨胀。

    【讨论】:

      【解决方案3】:

      可能对您有用的 Linux 实用程序

      a)包含在您的目标代码/库中的符号(比如一个函数)

      b)共享库的依赖分别是nmldd工具。

      下面的链接对于更多信息非常有用,

      http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html

      【讨论】:

        猜你喜欢
        • 2016-09-24
        • 1970-01-01
        • 2018-04-28
        • 1970-01-01
        • 1970-01-01
        • 2010-10-12
        • 1970-01-01
        • 2010-11-06
        • 1970-01-01
        相关资源
        最近更新 更多