C++ динамические библиотеки
vano 17 июня, 2007 - 18:08
Не много не по адресу. но наверняка кто-то сможет помочь.
В общем есть программа на C++ она подгружает динамическую библиотеку.
в Динамическую либу передается ссылка на родительский класс.
При обращении к public переменым из либы к родительскому классу нет.
Но есть ли какая-нибудь возможность вызвать из библиотеки родительский метод?
При попытке вызова падает в Segmentation fault.
Цитата:
/home/discomp/discomp/server//bin/discomp_server: symbol lookup error: /home/discomp/discomp/server/processes/dsat/plugin/libdsat_plugin.so: undefined symbol: _ZN14DiscompProcess10logMessageEi7QString
т.е. в либу передаю родительский класс
(условно):
Цитата:
-------- родитель ----------
void DiscompProcess::loadlib()
dynlib->load("libdsat_plugin.so");
dynlib->constructor(this)
}
void DiscompProcess::logMessage(const QString& str) {
}
-------- в либе ----------
void constructor ( DiscompProcess* process ) {
process->logMessage("test");
}
»
- Для комментирования войдите или зарегистрируйтесь
Я думаю, что
Я думаю, что надо в ибилиотеку еще вкомпилить код, отвечающий за DiscompProcess, т.е. не тольок заголовочный файл подключить, но и cxx файл слинковать с библиотекой.
Просто в исполняемом файле уже нет точек входа, отвечающих за функции этого класса, все связи, которые были, компилятор при сборке разрешил. Соответсвенно надо либо продублировать эти функции в библиотеке, либо объяснить библиотеке, по каким адресам расположены эти функции. Для этого надо либо вручную передавать все адреса, что очень не красиво, либо объяснить системе, что надо оставить точки входа. Как делается последнее не знаю, не сталкивался.
нашел решение.
нашел решение. все-таки QT - мощь.
сделал через QLoadPlugin. это обертка на QLibrary - стандартной подгрузки библиотек.
подцепляюсь к либе. получаю QObject*. навешиваю на него connect.
и потом все с использованием сигналов и слотов.
хоть из родителя в либу. хоть из либы до родителя.
QT не перестает поражать меня своей граммотностью и изяществом.