Jaa*_* L. 5 c gcc static-libraries weak-linking
我在 .c 文件中声明了一个带有 GCC 弱属性的外部函数:
extern int weakFunction( ) __attribute__ ((weak));
Run Code Online (Sandbox Code Playgroud)
编译后的目标文件将weakFunction 定义为弱符号。nm 的输出:
1791: w weakFunction
Run Code Online (Sandbox Code Playgroud)
我调用弱定义函数如下:
if (weakFunction != NULL)
{
weakFunction();
}
Run Code Online (Sandbox Code Playgroud)
当我通过将目标文件定义为 GCC ( gcc main.o weakf.o -o main.exe
) 弱符号的参数来链接程序时,工作正常。如果我将weakf.o 排除在链接之外,则main.c 中的函数地址为NULL,并且不会调用该函数。
问题是,当weakf.o 在静态库中时,由于某种原因链接器找不到该函数,函数地址总是以NULL 结尾。使用 ar 创建静态库:ar rcs weaklibrary weakf.o
有人遇到过类似的问题吗?
虽然我不知道弱符号的确切工作原理,但看起来您得到了您所要求的:如果没有其他人强制存在weakFunction(),那么main()也不会。对我来说,这是有道理的:如果您尝试编写可以在存在设施 X 的情况下使用以及没有设施 X 的情况下工作的代码,那么您不希望您的代码不惜一切代价强制将 X 包含在您的构建中。看起来“弱”的意思是询问某物是否存在,而不是要求某物存在。也许您可以在您的情况下强制包含“-uweakFunction”作为链接器选项的弱符号。
归档时间: |
|
查看次数: |
3788 次 |
最近记录: |