【问题标题】:How can I call a library function in an other library not directly connected to it?如何在没有直接连接的其他库中调用库函数?
【发布时间】:2019-02-02 21:32:39
【问题描述】:

这是我的示例,我有 main.cdlopens lib1.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,但是如果我删除main.c 中的注释//func2()(所以我只需在main 中至少调用一次func2()),程序就可以工作并且lib1 可以调用func2()
为什么我不能在lib1 中调用func2() 而不在main 中调用它,有什么办法可以避免这种情况?

【问题讨论】:

    标签: c gcc shared-libraries


    【解决方案1】:

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

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

    另一个有意义的解决方案是将lib1.solib2.so 链接起来。

    【讨论】:

    • 这正是我要找的,使用-Wl,--no-as-needed强制链接就足够了,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2013-02-19
    • 2016-09-28
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2013-06-28
    相关资源
    最近更新 更多