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

时间:2010-11-15 07:37:11

标签: optimization gcc

我将项目中的一些代码拆分为一个单独的库,以便在另一个应用程序中重用。这个新库有各种函数定义但不是实现,我当前的项目和其他应用程序都将实现这些函数的自己版本。

我在原始项目中实现了这些功能,但不会在其中的任何位置调用它们。它们只被这个新库调用。结果,编译器将它们优化掉,并且我得到链接失败。当我向这些函数添加一个虚拟调用时,链接失败就会消失。

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

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

4 个答案:

答案 0 :(得分:15)

您可以尝试__attribute__ ((used)) - 请参阅gcc手册中的Declaring Attributes of Functions

答案 1 :(得分:2)

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

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

在您的某个源文件的文件级别(甚至是一个全新的源文件,类似forcedCompiledFunctions.c的内容,因此很明显它的用途)。

因为这是非静态的,编译器将无法在其他地方找到你不需要它的机会,所以应该编译它。

答案 2 :(得分:2)

你的问题缺少一些细节,但我会试一试......

GCC通常会在极少数情况下删除功能:

  • 如果声明为静态
  • 在某些情况下(如使用-fno-implement-inlines)如果它们是内联声明的
  • 我错过的任何其他人

我建议使用'nm'来查看生成的.o文件中实际导出的符号,以验证这实际上是问题,然后查看任何杂散的“静态”关键字。不一定按此顺序......

编辑:

BTW,使用-Wall或-Wunused-function选项,GCC将警告未使用的函数,这些函数将在优化时成为删除的主要目标。注意

警告:'xxx'已定义但未使用

在您的编译日志中。

答案 3 :(得分:1)

请小心,因为-Wunused-functions不会如上所述警告未使用的函数。它警告静态的STATIC功能。

这是gcc的手册页所说的:

-无用功能            在声明了静态函数但未定义静态函数或未使用非内联静态函数时发出警告。这个警告是            由-Wall启用。

这本来适合作为评论,但我还不能评论答案。