这是我的示例,我有main.c
,即dlopen
的lib1.so
,并在链接时链接到lib2.so
。lib1.so
需要调用lib2.so
中定义的函数,如下所示:
main.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
(因此我只需在func2()
中至少调用一次main
),该程序就可以工作,并且lib1
可以调用func2()
。为什么不能在
func2()
中也调用它而不在lib1
中调用main
,有什么方法可以避免这种情况? 最佳答案
发生这种情况是由于在所有现代Linux发行版中默认启用了--as-needed链接器选项。链接器意识到主模块不使用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/