1. 使用不同的命名空间或前缀
如果你有控制权,可以修改动态库的代码,给函数添加不同的命名空间或前缀。例如:
// Library A
namespace LibraryA {
void foo() {
// Implementation for Library A
}
}
// Library B
namespace LibraryB {
void foo() {
// Implementation for Library B
}
}
然后在你的代码中调用时:
LibraryA::foo(); // Calls foo from Library A
LibraryB::foo(); // Calls foo from Library B
- 手动加载动态库并解析符号
手动加载动态库,用不同名字的函数指针取指向foo()
#include <dlfcn.h>
#include <iostream>
typedef void (*FooFunc)();
int main() {
void* handleA = dlopen("libA.so", RTLD_LAZY);
if (!handleA) {
std::cerr << "Cannot open library: " << dlerror() << '\n';
return 1;
}
FooFunc fooA = (FooFunc)dlsym(handleA, "foo");
if (!fooA) {
std::cerr << "Cannot load symbol 'foo': " << dlerror() << '\n';
dlclose(handleA);
return 1;
}
void* handleB = dlopen("libB.so", RTLD_LAZY);
if (!handleB) {
std::cerr << "Cannot open library: " << dlerror() << '\n';
dlclose(handleA);
return 1;
}
FooFunc fooB = (FooFunc)dlsym(handleB, "foo");
if (!fooB) {
std::cerr << "Cannot load symbol 'foo': " << dlerror() << '\n';
dlclose(handleA);
dlclose(handleB);
return 1;
}
fooA(); // Calls foo from Library A
fooB(); // Calls foo from Library B
dlclose(handleA);
dlclose(handleB);
return 0;
}