此问题在此处已有答案:
Compilers allow a weak symbol function with no implementation and no linker error(1个答案)
上个月关门了。
我试图解决的问题:
我想要一个静态链接到我的应用程序的库,在我的应用程序中调用一个函数。然而,当库被编译和安装时,它显然不知道我的应用程序。
我想我可以通过在库中包含函数名(我打算在应用程序中实现的函数名)并将其声明为weak来实现这一点:
lib_file.h:
__attribute__((weak)) int weak_func(int x, int y);
void func();
字符串
lib_file.c:
void func()
{
weak_func(6, 7); // Want this to call function implemented in my app
}
型
这成功地编译和链接,我重新安装库。
然而,我的应用程序也成功地编译和链接,即使我还没有实现该函数。
这是预期的吗?我希望链接器抱怨,我必须在我的应用程序中添加weak_func()
的实现。
我想达到的目标是可能的吗?
更新
在遵循了TianpingHsu的建议之后,我复制了他的自包含示例,拥有上面的两个文件和app.c:
#include "./lib_file.h"
int main()
{
func();
return 0;
}
型
当我编译和链接时:
gcc -c -o libfunc.o lib_file.c
ar rcs libfunc.a libfunc.o
gcc app.c -lfunc -L./
型
它不产生链接器警告:
的数据
并生成可执行文件:
的
在库上运行nm
显示没有地址:
的
而TianpingHsu得到u weak_func
。
我的平台是gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
1条答案
按热度按时间xoshrz7s1#
是的,我看到了你的another question,受雇的俄罗斯人的答案是正确的。
@rare77,问题中的
lib_file.c
源代码不包含头文件lib_file.h
,在gcc -c -o libfunc.o lib_file.c
之后会从lib_file.o
得到U weak_func
,似乎不需要使用属性((weak)),只需在静态库中声明一个普通函数weak_func
,并在应用程序中提供您的实现。如果您没有在应用程序中提供weak_func
,你会得到链接错误。P.S.
我把
#include "lib_file.h"
行添加到我的lib_file.c中,我确实从nm lib_file.o
得到了w weak_func
。如果你想以这种方式得到链接错误,你可以使用gcc的-u
选项,然而,这似乎是不必要的。原帖
也许你的链接有问题,比如你没有链接到你的弱版本静态库,或者你根本没有在你的应用中调用
func
。如果你做得对,当你链接库时,链接器会抱怨
weak_func
没有实现,消息是:undefined reference to *weak_func*
。请检查整个过程。以下是我对WSL的测试:
~/sandbox$ ls
app.c lib_file.c lib_file.h
构建静态库:
~/sandbox$ gcc -c -o libfunc.o lib_file.c
lib_file.c:在函数'func'中:
lib_file.c:3:5:警告:函数“weak_func”的隐式声明[-Wimplicit-function-declaration]
3 |weak_func(6,7); //希望此函数调用我的应用中实现的函数|^~
~/sandbox$ ar rcs libfunc. a libfunc.o
与app链接:
~/sandbox$ gcc app. c-lfunc-L./
/usr/bin/ld:.//libfunc.a(libfunc.o):在函数
func': lib_file.c:(.text+0x18): undefined reference to
weak_func'中collect 2:error:ld返回了1个退出状态
下面是
app.c
:字符串
我的平台:
Linux Abstraction 4.4.0-19041-Microsoft #3636-Microsoft Thu Oct 19 17:41:00 PST 2023 x86_64 x86_64 x86_64 GNU/Linux