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

12
我正在将项目中的一些代码分离到一个单独的库中,以便在另一个应用程序中重用。这个新的库有各种函数被定义但没有实现,当前项目和另一个应用程序都会实现它们自己的版本。
我在原始项目中实现了这些函数,但它们在项目内部没有被调用,只有这个新的库才会调用它们。因此,编译器会把它们优化掉,并且我会遇到链接错误。当我添加一个虚拟调用到这些函数时,链接错误就消失了。
有没有办法告诉GCC即使它们没有被调用也要编译这些函数呢?
我正在使用gcc 4.2.2,在SuSE linux(x86-64_linux_2.6.5_ImageSLES9SP3-3)上使用-O2进行编译。

@jcomeau:但是如果你想要进行优化呢? - Cascabel
如果它可以在没有优化的情况下工作,那么要做的就是找出要关闭哪些特定的优化;可能-fno-inline-small-functions是其中之一,但我从未深入研究过gcc如何实现其魔法。 - jcomeau_ictx
4个回答

20
您可以尝试使用__attribute__ ((used)) - 请参见gcc手册中的声明函数属性

4
作为务实主义者,我会简单表达为:
// Hopefully not a name collision :-)
void *xyzzy_plugh_zorkmid_3141592653589_2718281828459[] = {
    &functionToForceIn,
    &anotherFunction
};

在您的源文件之一(甚至是一个全新的源文件,比如forcedCompiledFunctions.c,这样就很明显它的用途)的文件级别上。

由于这是非静态的,编译器无法冒险认为您不需要它,因此应该进行编译。


2

你的问题缺少一些细节,但我会尽力解答...

GCC通常很少删除函数:

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

我建议使用'nm'命令查看生成的.o文件中实际导出了哪些符号,以验证这是否真的是问题所在,然后查找任何多余的'static'关键字。不一定按照这个顺序...

编辑:

顺便提一下,使用-Wall或-Wunused-function选项,GCC将警告未使用的函数,这些函数将成为优化时的主要目标。请注意编译日志中的

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


1
“我错过了其他的吗?”- Pax 笑着嗤之以鼻。 - paxdiablo

1

请注意,-Wunused-functions不像上面所述那样警告未使用的函数。它警告未使用的静态函数。

这是gcc手册上的内容:

-Wunused-function 每当声明了一个静态函数但未定义或未使用非内联静态函数时,就发出警告。此警告已由-Wall启用。

这更适合作为评论,但我还不能在答案中发表评论。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接