如何dlsym加载QString函数

问题描述 投票:2回答:2

我正在尝试使用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)的无效转换

我搜索谷歌如何使用动态加载库并获得像herehere这样的指令,任何人都可以告诉我如何在共享库中加载我的方法QString pushdata(QVariantMap params)。我正在使用Eclipse和Centos 6.5,Qt4.8

c++ linux qt shared-libraries dynamic-loading
2个回答
2
投票

您可以使用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();
}

1
投票

您可以使用Qt插件机制,如answered by Nejat

如果你坚持只使用dlopen(3)dlsym照顾:

  • 传递共享库的完整文件路径(例如dlopen("./foo.so", RTLD_NOW)不仅dlopen("foo.so" ... ) ...)并且总是测试dlopen的成功
  • 提防name mangling所以在你的插件中声明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 mini howto

© www.soinside.com 2019 - 2025. All rights reserved.