2010-11-15 111 views
8

我将我项目中的一些代码拆分为一个单独的库,以便在其他应用程序中重用。这个新的库有不同的功能定义但不是实施,我目前的项目和其他应用程序将实现他们自己的版本的这些功能。如何强制GCC编译未使用的函数?

我在我的原始项目中实现了这些功能,但是它们并没有在其中的任何地方被调用。他们只被这个新的图书馆调用。结果,编译器优化了它们,并且我发现链接失败。当我向这些函数添加虚拟调用时,链接失败消失。

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

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

+0

您是否尝试过使用-O0? – 2010-11-15 07:45:20

+0

@jcomeau:但是如果你想让它们优化呢? – Cascabel 2010-11-15 07:49:34

+0

如果它没有优化工作,那么要做的事情是找出哪些特定的优化关闭;可能-fno-inline-small-functions会是一个,但我从来没有深入探讨过gcc如何做它的魔法 – 2010-11-15 07:54:09

回答

2

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

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

在源文件中的一个(或甚至一个全新的源文件,沿forcedCompiledFunctions.c东西线的文件级别,这样很明显它是什么)。 。

因为这是非静态的,编译器将不能够采取一个机会,你会不会需要它在其他地方,所以应该编译它

2

你的问题缺少一些细节,但我给它一个镜头...

GCC一般在除去极少数情况下的功能:

  • 如果他们d eclared静态
  • 在某些情况下(使用-fno - 实施 - 内联时等),如果他们联声明
  • 任何其他人,我错过

我建议使用“纳米”看什么符号实际出口在生成的.o文件中验证这实际上是问题,然后查看有关任何杂散的“静态”关键字。在这个顺序也不一定......

编辑:

BTW,与-Wall或-Wunused功能选项GCC将警告有关未使用函数,那么这将是首要目标去除优化时。当心

警告:“XXX”定义,但在你的编译日志中不使用

+1

“我错过的任何其他人” - pax snorts with laughter :-) – paxdiablo 2010-11-15 08:01:58