Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Проба создать динамическую библиотеку.



  • Пробую создать динамическую библиотеку. Версия Qt - 4.13.0. Библиотека компилится, всё ок, подключаю её к проекту - ошибки. Для теста использовал функции в которых реализация в заголовочном файле - на них компилятор не ругается. На те функции где реализация вынесена - показывает ошибки например: " undefined reference to `testReturn2(int)' "

    ЪУЪ.PNG

    Создавал библиотеку через Qt'шное "Создать файл -> библиотека C++ -> Динамическая -> ... "
    Библиотеку подключал через Qt'шное "Добавить библиотеку..."

    Сыль на файлы.

    Я пробовал и всё кидать в ту же папку в которой находится проект, и пробовал заголовочный к libdina_lib_USB.a переносить, всё также.
    В gcc спокойно собирал и статические и динамические. а в Qt не осиливаю. по гайдам делаю и всё равно не понимаю.

    В чём дело может быть и чего делать с этим? Какой информации не хватает - напишите.

    ЪУЪ2.PNG

    Немного строк из файлов:
    dina_lib_usb.h :

    int testReturn0(int leet =  1337) {return leet;}
    
    int testReturn1(int leet =  1338);
    
    int testReturn2(int leet);
    
    int testReturn3() {
        int leet =  1339;
        return leet;
    }
    
    int testReturn4(int leet =  1340);
    
    int testReturn5();
    

    dina_lib_usb.cpp:

    int testReturn1(int leet) {return leet;}
    
    int testReturn2(int leet) {return leet;}
    
    int testReturn4(int leet) {return ++leet;}
    
    int testReturn5() {
        int leet =  1342;
        return leet;
    }
    

    использующий библиотеку
    main.cpp:

    #include <iostream>
    
    using namespace std;
    
    #include <dina_lib_usb.h>
    
    
    int main()
    {
        cout << "Hello test!" << endl;
        cout << testReturn0() << endl;
        cout << testReturn3() << endl;
        cout << testReturn2(228) << endl;
        cout << testReturn1() << endl;
        cout << testReturn1(229) << endl;
        cout << testReturn5() << endl;
        cout << testReturn4() << endl;
        return 0;
    }
    
    

    use_lib_USB_programm.pro:

    TEMPLATE = app
    QT += serialport core
    CONFIG += console c++11
    CONFIG -= app_bundle
    #CONFIG -= qt
    
    SOURCES += \
            main.cpp
    
    win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../compil_dina_lib_USB/release/ -ldina_lib_USB
    else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../compil_dina_lib_USB/debug/ -ldina_lib_USB
    
    INCLUDEPATH += $$PWD/../compil_dina_lib_USB/release
    DEPENDPATH += $$PWD/../compil_dina_lib_USB/release
    
    

    dina_lib_USB.pro:

    QT -= gui
    QT += serialport core
    TEMPLATE = lib
    DEFINES += DINA_LIB_USB_LIBRARY
    
    CONFIG += c++11
    
    # The following define makes your compiler emit warnings if you use
    # any Qt feature that has been marked deprecated (the exact warnings
    # depend on your compiler). Please consult the documentation of the
    # deprecated API in order to know how to port your code away from it.
    DEFINES += QT_DEPRECATED_WARNINGS
    
    # You can also make your code fail to compile if it uses deprecated APIs.
    # In order to do so, uncomment the following line.
    # You can also select to disable deprecated APIs only up to a certain version of Qt.
    #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
    
    SOURCES += \
        dina_lib_usb.cpp
    
    HEADERS += \
        dina_lib_USB_global.h \
        dina_lib_usb.h
    
    # Default rules for deployment.
    unix {
        target.path = /usr/lib
    }
    !isEmpty(target.path): INSTALLS += target
    
    


  • В виндовсе принято, что по-умолчанию все символы в dll явяляются скрытыми, и их надо явно экспортировать на стороне определения и импортировать на вызывающей стороне. Для этого можно использовать макросы Q_DECL_EXPORT и Q_DECL_IMPORT. См. https://wiki.qt.io/How_to_create_a_library_with_Qt_and_use_it_in_an_application/ru



  • Если вопрос решен, закрывайте тему



  • @Konstantin-Tokarev said in Проба создать динамическую библиотеку.:

    Если вопрос решен, закрывайте тему

    Я ещё не проверил этот способ. Сегодня совсем никак не получилось. (



  • @Konstantin-Tokarev Да, всё заработало. нужно было прописать экспорты к функциям и классам у которых реализация в сипипишнике


Log in to reply