代码之家  ›  专栏  ›  技术社区  ›  Nathan Fellman

如何强制GCC编译未使用的函数?

  •  9
  • Nathan Fellman  · 技术社区  · 15 年前

    我正在将项目中的一些代码拆分成一个单独的库,以便在另一个应用程序中重用。这个新图书馆有多种功能 定义 但不是 实施 ,并且我当前的项目和其他应用程序都将实现这些函数的各自版本。

    我在最初的项目中实现了这些功能,但它们在项目中的任何地方都不会被调用。只有这个新图书馆才叫他们。结果,编译器优化了它们,我得到链接失败。当我向这些函数添加一个虚拟调用时,链接失败将消失。

    有没有办法告诉GCC编译这些函数,即使它们没有被调用?

    我使用gcc 4.2.2编译 -O2 在SuSE linux上(x86-64_linux_2.6.5_ImageSLES9SP3-3)。

    4 回复  |  直到 15 年前
        1
  •  17
  •   Paul R    12 年前

    你可以试试 __attribute__ ((used)) -见 Declaring Attributes of Functions 在gcc手册中。

        2
  •  2
  •   paxdiablo    15 年前

    作为一个实用主义者,我只想说:

    // Hopefully not a name collision :-)
    void *xyzzy_plugh_zorkmid_3141592653589_2718281828459[] = {
        &functionToForceIn,
        &anotherFunction
    };
    

    在一个源文件(甚至是一个全新的源文件)的文件级别 forcedCompiledFunctions.c ,所以很明显是为了什么)。

    因为这是非静态的,所以编译器不能冒险让您在其他地方不需要它,所以应该在中编译它。

        3
  •  2
  •   thkala jaxb    15 年前

    你的问题缺乏一些细节,但我会试一试。。。

    GCC通常在极少数情况下删除函数:

    • 如果它们被声明为静态的
    • 在某些情况下(比如使用-fno实现内联时),如果它们是内联声明的
    • 还有我错过的吗

    我建议使用“nm”来查看在生成的.o文件中实际导出了哪些符号,以验证这确实是问题所在,然后查看有关任何杂散的“静态”关键字的信息。不一定按这个顺序。。。

    编辑:

    顺便说一下,使用-Wall或-Wunused函数选项,GCC将警告未使用的函数,这些函数将成为优化时删除的主要目标。当心

    警告:xxx已定义但未使用

    在编译日志中。

        4
  •  1
  •   Professor NEO    7 年前

    注意,-Wunused函数不会警告上面提到的未使用的函数。它警告未使用的静态函数。

    下面是gcc的手册页:

    -Wunused函数 每当声明但未定义静态函数或未使用非内联静态函数时发出警告。这个警告是 由-Wall启用。

    这是一个更合适的评论,但我还不能评论答案。