繁体   English   中英

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

[英]How can I force GCC to compile functions that are not used?

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

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

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

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

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

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

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

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

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

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

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

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

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

编辑:

顺便说一句,使用-Wall或-Wunused-function选项,GCC会警告未使用的功能,这将是优化时删除的主要目标。 提防

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

在您的编译日志中。

请小心,因为-Wunused函数不会警告上述未使用的函数。 它警告未激活的STATIC功能。

这是gcc的手册页说的:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM