first.cpp
#ifdef __cplusplus
extern "C" {
#endif
double add(double a, double b)
{
return a + b;
}
#ifdef __cplusplus
}
#endif
second.cpp
double multiply(double a, double b)
{
return a * b;
}
生成动态库
g++ -fPIC -c first.cpp second.cpp
g++ -shared first.o second.o -o libdynamiclib.so
添加库路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
main.cpp
#include <dlfcn.h>
#include <iostream>
using namespace std;
using P_FUNC = double (*)(double, double);
int main()
{
void* pHandle = nullptr;
pHandle = dlopen("libdynamiclib.so", RTLD_LAZY);
if (!pHandle) {
cout << "dlopen error: " << dlerror() << endl;
return -1;
}
P_FUNC pFunc = (P_FUNC)dlsym(pHandle, "add");
if (!pFunc) {
cout << "dlsym error: " << dlerror() << endl;
dlclose(pHandle);
pHandle = nullptr;
return -1;
}
cout << pFunc(1.1, 2.2) << endl;
dlclose(pHandle);
pHandle = nullptr;
return 0;
}
编译
g++ main.cpp -ldl
执行
./a.out
结果
3.3