【发布时间】:2019-02-02 21:32:39
【问题描述】:
这是我的示例,我有 main.c,dlopens 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,但是如果我删除main.c 中的注释//func2()(所以我只需在main 中至少调用一次func2()),程序就可以工作并且lib1 可以调用func2()。
为什么我不能在lib1 中调用func2() 而不在main 中调用它,有什么办法可以避免这种情况?
【问题讨论】:
标签: c gcc shared-libraries