静态库调用没有实现的弱函数时不会出现链接器错误

问题描述 投票:0回答:1

我试图解决的总体问题:

我想要一个静态链接到我的应用程序的库,以调用我的应用程序中的函数。但是,当编译并安装该库时,它显然不知道我的应用程序。

我认为我可以通过在库中包含函数名称(我打算在应用程序中实现的函数名称)并将其声明为弱来实现这一目标:

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()
的实现。

我想要实现的目标可能吗?

c++ gcc linker clang static-libraries
1个回答
0
投票

也许你的链接有问题,比如说你没有链接到你的弱版本静态库,或者你根本没有在你的应用程序中调用

func

如果你做对了,当你链接库时,链接器会抱怨

weak_func
没有实现,并显示消息:
undefined reference to *weak_func*
。请检查整个过程。

这是我对 WSL 的测试:

~/沙盒$ 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 |弱函数(6, 7); // 想要调用我的应用程序中实现的函数 | ^~~~~~~~~

与应用程序链接:

~/sandbox$ gcc app.c -lfunc -L./
/usr/bin/ld: .//libfunc.a(libfunc.o): 在函数

func':   lib_file.c:(.text+0x18): undefined reference to 
weak_func'
收集2:错误:ld返回1退出状态

这是

app.c

#include "./lib_file.h"

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

我的平台:

Linux 抽象 4.4.0-19041-Microsoft #3636-Microsoft 10 月 19 日星期四 17:41:00 PST 2023 x86_64 x86_64 x86_64 GNU/Linux

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.