Задал вопрос на специализированном форуме, но ответа не получил. Попробую ещё здесь спросить. Значит дело происходит под линухом, используется библиотека QT. Пишу динамически подгружаемую либу. В ней одна тестовая функция: Код (Text): extern "C" int libMain( int argc, char ** argv ) { qDebug ("library main function"); } Компилирую, из тестовой проги, используя интерфейс QLibrary (реализующий функционал аналогичный LoadLibrary+GetProcAddress), подгружаю либу, получаю адрес libMain и вызываю её. Всё работает на ура: Код (Text): int main( int argc, char ** argv ) { QApplication app( argc, argv ); QLibrary lib( app.applicationDirPath() + "/libofn/ofn" ); if ( lib.load() ){ qDebug("library loaded"); typedef int (*_libMain)( int, char** ); _libMain libMain = (_libMain) lib.resolve( "libMain" ); if ( libMain ) libMain( 0, 0 ); else qDebug("libMain not found"); } else{ qDebug("library loading fail"); } lib.unload(); return 0; } Теперь следующий шаг: добавил в либу класс (два отдельных файла myclass.h и myclass.cpp), реализующий обычный диалог, просто окошко и ничего больше. Для проверки скомпилил либу как исполняемых файл, запустил - всё работает, диалог на месте. Перекомпилирую как либу и пытаюсь загрузить её из тестовой проги - а либа-то отказывается загружаться. В чем может быть проблема? Класс я не экспортирую из либы (предполагается работать с ним из libMain). Это что, принципиально невозможно совместить в либе класс и просто функцию или причина в ином?
t00x разобрался. Дело не в классе. Ошибка (или провокация) в хелпе QT3. QLibrary::QLibrary ( const QString & filename ) Creates a QLibrary object for the shared library filename. The library will be unloaded in the destructor. Note that filename does not need to include the (platform specific) file extension, so calling QLibrary lib( "mylib" ); is equivalent to calling QLibrary lib( "mylib.dll" ); on Windows, and QLibrary lib( "libmylib.so" ); on Unix. Specifying the extension is not recommended, since doing so introduces a platform dependency. В целях кроссплатформенности не рекомендуется указывать расширение... Я и сделал как указано: просто имя либы, без расширения и номера версии: QLibrary lib( app.applicationDirPath() + "/libofn/ofn" ); Оказывается, надо было вопреки хелпу указывать и расширение, и номер версии, иначе не грузится, если в либе класс: QLibrary lib( app.applicationDirPath() + "/libofn/libofn.so.1.0.0" ); и никак иначе. Так что если будешь писать либу, учти этот момент.
cresta Потому что нет в системе линка libmylib.so -> libofn.so.1.0.0. Считается, что такие линки должны присутствовать.
Quantum Всё верно, вот только непонятно, какая разница, есть внутри либы класс или нет? Если класса нет, вполне обходимся и без линка (libofn.so), а если внутри либы класс, то требуется либо линк на libofn.so.1.0.0, либо непосредственно указывать libofn.so.1.0.0. Как влияет класс на это дело?