C ++如何用户动态库(.so文件)

时间:2014-02-20 13:54:46

标签: c++ dynamic-library

我有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);
}

1 个答案:

答案 0 :(得分:3)

看起来你正在使用C ++

vector<string> getUsbList();

C ++应用所谓的“名称修改”,根据其输入和输出参数的类型为每个函数符号赋予唯一的名称。这样做是为了支持函数重载(具有相同名称但具有不同参数类型的多个函数)。

您必须根据损坏的名称加载,或者必须禁用名称修改(因此能够重载该函数)。

由于没有关于名称如何被破坏的标准,并且每个编译器可能以不同方式实现它,因此这不是一个非常强大的方法。

禁用名称修改是通过使用

包围标题中的函数声明来完成的
extern "C" {

// ...

}