这是我的示例,我有main.c,即dlopenlib1.so,并在链接时链接到lib2.solib1.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.solib2.so链接。

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

10-15 12:06