как dlsym загрузить QString Funcion

Я пытаюсь написать инструмент для C ++, используя Qt для системы Linux. мой инструмент с использованием общей библиотеки
я пишу библиотеку для отправки данных в базу данных. такой метод в заголовочном файле

QString pushdata(QVariantMap params);

эта функция помещена в 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 *’ в St QString () (QVariantMap)

Я ищу в Google, как использовать динамическую библиотеку загрузки и получить инструкцию, как это Вот
а также Вот любой может показать мне, как загрузить мой метод QString pushdata(QVariantMap params) в общей библиотеке Я использую затмение а также Centos 6.5, Qt4.8

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();
}
2

Другие решения

Вы можете использовать плагин Qt, как ответил Неджат.

Если вы настаиваете на использовании только dlopen (3) а также dlsym заботиться о:

  • передача полного пути к файлу совместно используемой библиотеки (например, dlopen("./foo.so", RTLD_NOW) не только dlopen("foo.so") …) и всегда проверяю успех dlopen
  • остерегаться название искажения так объявить dlsymфункция как 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

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector