Класс в либе

Тема в разделе "WASM.UNIX", создана пользователем cresta, 12 авг 2007.

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Задал вопрос на специализированном форуме, но ответа не получил. Попробую ещё здесь спросить.
    Значит дело происходит под линухом, используется библиотека QT. Пишу динамически подгружаемую либу. В ней одна тестовая функция:

    Код (Text):
    1. extern "C" int libMain( int argc, char ** argv )
    2. {
    3.     qDebug ("library main function");
    4. }
    Компилирую, из тестовой проги, используя интерфейс QLibrary (реализующий функционал аналогичный LoadLibrary+GetProcAddress), подгружаю либу, получаю адрес libMain и вызываю её. Всё работает на ура:

    Код (Text):
    1. int main( int argc, char ** argv )
    2. {
    3.     QApplication app( argc, argv );
    4.     QLibrary lib( app.applicationDirPath() + "/libofn/ofn" );
    5.    
    6.     if ( lib.load() ){
    7.         qDebug("library loaded");
    8.         typedef int (*_libMain)( int, char** );
    9.         _libMain libMain = (_libMain) lib.resolve( "libMain" );
    10.         if ( libMain )
    11.             libMain( 0, 0 );
    12.         else
    13.             qDebug("libMain  not found");
    14.     }
    15.     else{
    16.         qDebug("library loading fail");
    17.     }
    18.  
    19.     lib.unload();    
    20.     return 0;
    21. }
    Теперь следующий шаг: добавил в либу класс (два отдельных файла myclass.h и myclass.cpp), реализующий обычный диалог, просто окошко и ничего больше. Для проверки скомпилил либу как исполняемых файл, запустил - всё работает, диалог на месте.
    Перекомпилирую как либу и пытаюсь загрузить её из тестовой проги - а либа-то отказывается загружаться. В чем может быть проблема? Класс я не экспортирую из либы (предполагается работать с ним из libMain).
    Это что, принципиально невозможно совместить в либе класс и просто функцию или причина в ином?
     
  2. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    Окошко какого класса? Может быть этот класс не описан в main'е?
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    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" );
    и никак иначе.
    Так что если будешь писать либу, учти этот момент.
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    cresta
    Потому что нет в системе линка libmylib.so -> libofn.so.1.0.0. Считается, что такие линки должны присутствовать.
     
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Quantum
    Всё верно, вот только непонятно, какая разница, есть внутри либы класс или нет? Если класса нет, вполне обходимся и без линка (libofn.so), а если внутри либы класс, то требуется либо линк на libofn.so.1.0.0, либо непосредственно указывать libofn.so.1.0.0.
    Как влияет класс на это дело?