gpt4 book ai didi

c - 如何在不直接连接到它的其他库中调用库函数?

转载 作者:太空狗 更新时间:2023-10-29 17:24:47 28 4
gpt4 key购买 nike

这是我的示例,我有 main.cdlopenlib1.so 并链接到 lib2。所以 在链接时。lib1.so 需要调用定义在lib2.so 中的函数,像这样:

主.c

extern void func2();

int main(){
void *handle;
void (*lib1)();

handle = dlopen("./lib1.so", RTLD_LAZY);
*(void**)(&lib1) = dlsym(handle, "lib1");
if(!lib1){
printf("Can't find lib1\n");
}
else{
func1();
dlclose(handle);
}
//func2();
return 0;
}


lib1.c

extern void func2();

void func1(){
printf("Function1\n");
func2();
}


lib2.c

void func2(){
printf("Function2\n");
}


我编译 main 因为我以前很伤心

gcc -rdynamic main.c -o main lib2.so -ldl

但是当我运行 main 时,我得到 undefined symbol: lib2,但是如果我在 中删除注释 //func2() >main.c(所以我只需在 main 中至少调用一次 func2()),程序运行并且 lib1能够调用func2()
为什么我不能在 lib1 中调用 func2() 而不在 main 中调用它,有什么办法可以避免这种情况吗?

最佳答案

发生这种情况是由于 --as-needed所有现代 Linux 发行版都默认启用链接器选项。链接器意识到主模块不使用 lib2.so 中的任何内容并忽略 -llib2 选项。要强制 lib2.so 链接,您可以插入对其功能之一的伪引用(如您所建议的那样),或者在链接 时简单地禁用 --as-needed lib2.so:

gcc ... -Wl,--no-as-needed lib2.so -Wl,--as-needed

另一个有意义的解决方案是将 lib1.so 链接到 lib2.so

关于c - 如何在不直接连接到它的其他库中调用库函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52054657/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com