如何dlsym加载QString函数 我试图用QT编写Linux系统的C++工具。我的工具使用共享库 我正在编写一个库来将数据推送到数据库。方法类似于头文件中的方法

如何dlsym加载QString函数 我试图用QT编写Linux系统的C++工具。我的工具使用共享库 我正在编写一个库来将数据推送到数据库。方法类似于头文件中的方法,c++,linux,qt,shared-libraries,dynamic-loading,C++,Linux,Qt,Shared Libraries,Dynamic Loading,QString推送数据(QVariantMap参数) 此函数放入lib调用libpushdata.so。我想加载动态库。所以我使用dlfcn.h和类似的方法: void *handle; QString (*pushdata)(QVariantMap*); handle = dlopen("libpushdata.so", RTLD_LAZY); if (!handle) { fputs(dlerror(), stderr); exit(1); } pushdata=dlsym(

QString推送数据(QVariantMap参数)

此函数放入lib调用libpushdata.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)”的转换无效

我在谷歌上搜索如何使用动态加载库,并得到这样的指令
任何人都可以告诉我如何在共享库中加载我的方法
QString pushdata(QVariantMap参数)
。我正在使用Eclipse和Centos 6.5,Qt4.8可以动态调用函数。以下示例在运行时从共享库调用函数:

#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();
}
#包括
#包括
typedef QString(*调用函数)(QVariantMap*arg1);
int main(int argc,char*argv[])
{
qcorea应用程序(argc、argv);
QLibrary图书馆(“动态图书馆”);
load();
如果(!library.isLoaded())
{

qDebug()您可以使用Qt插件机制,如下所示

如果您坚持使用just和
dlsym
请注意:

  • 传递共享库的完整文件路径(例如,
    dlopen(“/foo.so”,RTLD\u 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); }
    
    typedef QString pushdata_sig_t(QVariantMap*);
    pushdata\u信号*pushdata
    =重新解释铸件(dlsym(手柄,“pushdata”);
    如果(!pushdata)
    
    {std::cerr感谢@Nejat,我尝试了你的方法,但在加载共享库时仍然出现错误
    错误:liblibtest.so:无法打开共享对象文件:没有这样的文件或目录
    你是否将so文件放在可执行文件旁边?你是否将库链接到你的应用程序?或者你想动态加载它?我还链接我的应用程序n到库,但它仍然错误。当我cd到包含应用程序的目录并使用
    exprot LD_library\u PATH=/root/Desktop/loaddl/Debug
    /application
    应用程序正常运行时,调试文件夹包含lib.so@。那么,您能告诉我如何使用
    exprot LD_library\u PATH
    运行应用程序吗仅使用。/applicationn要运行如果要在运行时动态加载库,为什么要将其链接到应用程序?如果要动态加载,则无需链接。