我在.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
有人有过类似的问题吗?
答案 0 :(得分:4)
虽然我不知道弱符号的确切工作方式,但看起来你得到了你所要求的:如果没有其他人强迫weakFunction()存在,那么main()也不会。对我而言,这是有道理的:如果您正在尝试编写适用于设施X的代码以及没有它的代码,那么您不希望代码强制X不惜一切代价包含在您的构建中。看起来“弱”意味着要求如果存在某些东西,而不是要求 存在某些东西。 也许您可以在您的情况下强制使用“-u weakFunction”作为链接器选项包含弱符号。