在C语言中,如果你需要调用两个库中的同名函数,这会引起问题,因为链接器在连接阶段会遇到符号冲突。
解决办法
可以 dlopen 动态加载库,并使用 dlsym 获取函数指针。这样可以避免符号冲突,并且你可以分别调用两个库中的同名函数。
举个例子:假设有两个库 libA.so 和 libB.so,每个库中都有一个名为 foo 的函数。
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
// 定义函数指针类型
typedef void (*foo_func)();
int main() {
// 打开libA.so
void* handleA = dlopen("./libA.so", RTLD_LAZY);
if (!handleA) {
fprintf(stderr, "%s\n", dlerror());
exit(EXIT_FAILURE);
}
// 获取libA.so中的foo函数
foo_func fooA = (foo_func)dlsym(handleA, "foo");
if (!fooA) {
fprintf(stderr, "%s\n", dlerror());
exit(EXIT_FAILURE);
}
// 打开libB.so
void* handleB = dlopen("./libB.so", RTLD_LAZY);
if (!handleB) {
fprintf(stderr, "%s\n", dlerror());
exit(EXIT_FAILURE);
}
// 获取libB.so中的foo函数
foo_func fooB = (foo_func)dlsym(handleB, "foo");
if (!fooB) {
fprintf(stderr, "%s\n", dlerror());
exit(EXIT_FAILURE);
}
// 调用libA.so中的foo函数
fooA();
// 调用libB.so中的foo函数
fooB();
// 关闭库
dlclose(handleA);
dlclose(handleB);
return 0;
}
总结
使用动态加载库(dlopen 和 dlsym)不仅能解决符号冲突,还能在运行时灵活加载和卸载库。