我正在尝试使用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)
在共享库。 我使用Eclipse和Centos 6.5 , Qt4.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