Я пытаюсь написать инструмент для 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
Ты можешь использовать 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, как ответил Неджат.
Если вы настаиваете на использовании только 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