我有myLib.so文件和USB.h头文件。 我的头文件看起来像这样,myLib.so包含此头文件的实现。如何使用myLib.so在main.cpp中调用getUsbList函数。
#ifndef USB_H
#define USB_H
#include <string.h>
#include <string>
#include <vector>
vector<string> getUsbList();
#endif // USB_H
我试试这个,但它给出了错误:无法加载符号'getUsbList':myLib.so:undefined symbol:getUsbList
#include <iostream>
#include <dlfcn.h>
#include "USB.h"
int main() {
using std::cout;
using std::cerr;
cout << "C++ dlopen demo\n\n";
// open the library
cout << "Opening myLib.so...\n";
void* handle = dlopen("myLib.so", RTLD_LAZY);
if (!handle) {
cerr << "Cannot open library: " << dlerror() << '\n';
return 1;
}
// load the symbol
cout << "Loading symbol myLib...\n";
typedef void (*USB_t)();
// reset errors
dlerror();
USB_t getUsbList = (USB_t) dlsym(handle, "getUsbList");
const char *dlsym_error = dlerror();
if (dlsym_error) {
cerr << "Cannot load symbol 'getUsbList': " << dlsym_error <<
'\n';
dlclose(handle);
return 1;
}
// use it to do the calculation
cout << "Calling getUsbList...\n";
getUsbList();
// close the library
cout << "Closing library...\n";
dlclose(handle);
}
答案 0 :(得分:3)
看起来你正在使用C ++
vector<string> getUsbList();
C ++应用所谓的“名称修改”,根据其输入和输出参数的类型为每个函数符号赋予唯一的名称。这样做是为了支持函数重载(具有相同名称但具有不同参数类型的多个函数)。
您必须根据损坏的名称加载,或者必须禁用名称修改(因此能够重载该函数)。
由于没有关于名称如何被破坏的标准,并且每个编译器可能以不同方式实现它,因此这不是一个非常强大的方法。
禁用名称修改是通过使用
包围标题中的函数声明来完成的extern "C" {
// ...
}