gcc 当静态库调用没有实现的弱函数时没有链接器错误[重复]

5us2dqdw  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(211)

此问题在此处已有答案

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

xoshrz7s

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

#include "./lib_file.h"

int main() {
    func();
    return 0;
}

字符串
我的平台:
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

相关问题