我正在尝试使用Qt为Linux系统编写一个C ++工具。我的工具使用共享库我正在编写一个lib来将数据推送到数据库。头文件中的方法
QString pushdata(QVariantMap params);
这个fucion放在lib中调用libpushdata.so。我想加载动态lib.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)的无效转换
我搜索谷歌如何使用动态加载库并获得像here和here这样的指令,任何人都可以告诉我如何在共享库中加载我的方法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插件机制,如answered by 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); }