C语言调用两个lib中的同名函数
在C语言中,如果你需要调用两个库中的同名函数,这会引起问题,因为链接器在连接阶段会遇到符号冲突。
解决办法
可以 dlopen 动态加载库,并使用 dlsym 获取函数指针。这样可以避免符号冲突,并且你可以分别调用两个库中的同名函数。
举个例子:假设有两个库 libA.so 和 libB.so,每个库中都有一个名为 foo 的函数。
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>// 定义函数指针类型
typedef void (*foo_func)();int main() {// 打开libA.sovoid* 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.sovoid* 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)不仅能解决符号冲突,还能在运行时灵活加载和卸载库。