如何dlsym加载QString Funcion

我正在尝试使用Qt for linux系统编写一个C ++工具。 我的工具使用共享库即时通讯库来推送数据到数据库。 类似于头文件中的方法

QString pushdata(QVariantMap params);

这个fucion放在lib中调用libpushdata.so。 我想加载dynamiclib.so即时通讯使用dlfcn.h和方法

 void *handle; QString (*pushdata)(QVariantMap*); handle = dlopen("libpushdata.so", RTLD_LAZY); if (!handle) { fputs(dlerror(), stderr); exit(1); } pushdata=dlsym(handle,"pushdata"); 

当编译程序即时得到错误

无效转换从'void *'到'QString( )(QVariantMap

即时search谷歌如何使用dynamic加载库,并得到这样的指令, 在 这里,任何人都可以告诉我如何加载我的方法QString pushdata(QVariantMap params)在共享库。 我使用EclipseCentos 6.5Qt4.8

您可以使用QLibrary动态调用函数。 以下示例在运行时从共享库调用函数:

 #include <QLibrary> #include <QDebug> typedef QString (*call_func)(QVariantMap* arg1); int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QLibrary library( "dynamic_library" ); library.load(); if( !library.isLoaded() ) { qDebug() << "Cannot load library."; return 0; } call_func func = (call_func)library.resolve( "pushdata" ); if(func) { func(variantMap); } return a.exec(); } 

您可以使用Qt插件机械, Nejat回答 。

如果你坚持只使用dlopen(3)和dlsym注意:

  • 传递共享库的完整文件路径(例如, dlopen("./foo.so", RTLD_NOW)不仅dlopen("foo.so") …),并总是测试dlopen的成功
  • 当心名称混乱,因此在您的插件中声明dlsym -ed函数为extern "C"
  • 明确地投射结果指针:

     typedef QString pushdata_sig_t(QVariantMap*); pushdata_sig_t* pushdata = reinterpret_cast<pushdata_sig_t*>(dlsym(handle,"pushdata")); if (!pushdata) { std::cerr << "dlsym failed:" << dlerror () << std::endl; exit(EXIT_FAILURE); } 

阅读至少C ++ dlopen迷你howto