我试图解决的总体问题:
我想要一个静态链接到我的应用程序的库,以调用我的应用程序中的函数。但是,当编译并安装该库时,它显然不知道我的应用程序。
我认为我可以通过在库中包含函数名称(我打算在应用程序中实现的函数名称)并将其声明为弱来实现这一目标:
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()
的实现。
我想要实现的目标可能吗?
也许你的链接有问题,比如说你没有链接到你的弱版本静态库,或者你根本没有在你的应用程序中调用
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): 在函数weak_func'
func': lib_file.c:(.text+0x18): undefined reference to
收集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