5

我在 .c 文件中声明了一个带有 GCC 弱属性的外部函数:

extern int weakFunction( ) __attribute__ ((weak));

编译后的目标文件将weakFunction 定义为弱符号。nm的输出:

1791:         w weakFunction

我调用弱定义函数如下:

if (weakFunction != NULL)
{
    weakFunction();
}

当我通过将目标文件定义为 GCC ( gcc main.o weakf.o -o main.exe) 的参数来链接程序时,弱符号工作正常。如果我将weakf.o 排除在链接之外,则main.c 中的函数地址为NULL,并且不会调用该函数。

问题是,当weakf.o 在静态库中时,由于某种原因,链接器找不到函数并且函数地址总是最终为NULL。静态库是用 ar 创建的:ar rcs weaklibrary weakf.o

有人有类似的问题吗?

4

1 回答 1

4

虽然我不知道弱符号的确切工作原理,但看起来你得到了你所要求的:如果没有其他人强迫 weakFunction() 存在,main() 也不会。对我来说,这是有道理的:如果您正在尝试编写与设施 X 一起工作的代码,那么您不希望您的代码不惜一切代价强制将 X 包含在您的构建中。看起来“弱”的意思是询问是否存在某些东西,而不是要求存在某些东西。在您的情况下,也许您可​​以使用“-u weakFunction”作为链接器选项强制包含弱符号。

于 2010-04-13T09:21:22.257 回答