Как устранить ошибку ссылки в Qt с помощью библиотеки Telegram (Td)

Я столкнулся с ошибкой ссылки при создании примера приложения, вот этого (https://github.com/tdlib/td/blob/master/example/cpp/td_example.cpp) Я создал проект в Qt Creator и добавил в проект td_example.cpp. Также ранее я собирал библиотеку 32x Td из исходников, используя эту инструкцию https://tdlib.github.io/td/build.html?language=C%2B%2B .

Артефакты Td расположены по этому пути K:\QtProjects\Telegram\TelegramDependency\td\tdlib , здесь расположены 3 папки (bin, include и lib).

в папке bin расположены 4 файла .dll (libcrypto-1_1.dll, libssl-1_1.dll, tdjson.dll, zlibd1.dll)

в папке lib (tdactor.lib, tdapi.lib, tdclient.lib, tdcore.lib, tddb.lib, tdjson.lib, tdjson_private.lib, tdjson_static.lib, tdnet.lib, tdsqlite.lib, tdutils.lib)

Мой проект находится по этому пути K:\QtProjects\Telegram\TelegramTestAPP

в папке TelegramTestAPP у меня есть файл .pro с таким содержимым.

QT += quick

CONFIG += c++20

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
        Logger.cpp \
        main.cpp \

RESOURCES += qml.qrc

# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =

# Additional import path used to resolve QML modules just for Qt Quick Designer
QML_DESIGNER_IMPORT_PATH =

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

HEADERS += \
    Logger.h \
    td_example.h


win32: LIBS += -L'$$PWD/../TelegramDependency/td/tdlib/lib/' -ltdjson


INCLUDEPATH += $$PWD/../TelegramDependency/td/tdlib/include
DEPENDPATH += $$PWD/../TelegramDependency/td/tdlib/include

я удалил основную функцию из td_example.cpp и переименовал ее в td_example.h, после чего я включил этот заголовочный файл и вызвал его из main.cpp внутри основной функции

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "td_example.h"

int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;

    engine.rootContext()->setContextProperty(QStringLiteral("CLogger"), &Logger::GetInstance());

    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);

    engine.load(url);

    TdExample example;
    example.loop();

    return app.exec();
}

Итак, вопрос в том, почему я получаю пример ошибки ссылки

main.obj:-1: error: LNK2019: unresolved external symbol "public: __thiscall td::td_api::tdlibParameters::tdlibParameters(void)" (??0tdlibParameters@td_api@td@@QAE@XZ) referenced in function "class td::tl::unique_ptr<class td::td_api::tdlibParameters> __cdecl td::td_api::make_object<class td::td_api::tdlibParameters>(void)" (??$make_object@VtdlibParameters@td_api@td@@$$V@td_api@td@@YA?AV?$unique_ptr@VtdlibParameters@td_api@td@@@tl@1@XZ)

компилятор: Microsoft Visual C++ Complier 14.0 (amd64_x86) Я также скопировал все .dll из папки bin в папку отладки (TelegramTestAPP/build/debug)

РЕДАКТИРОВАТЬ Добавлены все статические библиотеки в файл .pro

win32: LIBS += -L'$$PWD/../TelegramDependency/td/tdlib/lib/' -ltdapi
win32: LIBS += -L'$$PWD/../TelegramDependency/td/tdlib/lib/' -ltdutils
win32: LIBS += -L'$$PWD/../TelegramDependency/td/tdlib/lib/' -ltdclient
win32: LIBS += -L'$$PWD/../TelegramDependency/td/tdlib/lib/' -ltdnet
win32: LIBS += -L'$$PWD/../TelegramDependency/td/tdlib/lib/' -ltdcore
win32: LIBS += -L'$$PWD/../TelegramDependency/td/tdlib/lib/' -ltdsqlite
win32: LIBS += -L'$$PWD/../TelegramDependency/td/tdlib/lib/' -ltdactor
win32: LIBS += -L'$$PWD/../TelegramDependency/td/tdlib/lib/' -ltddb


INCLUDEPATH += $$PWD/../TelegramDependency/td/tdlib/include
DEPENDPATH += $$PWD/../TelegramDependency/td/tdlib/include


win32: PRE_TARGETDEPS += $$PWD/../TelegramDependency/td/tdlib/lib/tdcore.lib
win32: PRE_TARGETDEPS += $$PWD/../TelegramDependency/td/tdlib/lib/tdapi.lib
win32: PRE_TARGETDEPS += $$PWD/../TelegramDependency/td/tdlib/lib/tdclient.lib
win32: PRE_TARGETDEPS += $$PWD/../TelegramDependency/td/tdlib/lib/tdutils.lib
win32: PRE_TARGETDEPS += $$PWD/../TelegramDependency/td/tdlib/lib/tdactor.lib
win32: PRE_TARGETDEPS += $$PWD/../TelegramDependency/td/tdlib/lib/tddb.lib
win32: PRE_TARGETDEPS += $$PWD/../TelegramDependency/td/tdlib/lib/tdnet.lib
win32: PRE_TARGETDEPS += $$PWD/../TelegramDependency/td/tdlib/lib/tdsqlite.lib

win32: LIBS += -L'C:/Program Files (x86)/OpenSSL-Win32/lib/VC/' -llibcrypto32MDd
win32: LIBS += -L'C:/Program Files (x86)/OpenSSL-Win32/lib/VC/' -llibssl32MDd

INCLUDEPATH += 'C:/Program Files (x86)/OpenSSL-Win32/include'
DEPENDPATH += 'C:/Program Files (x86)/OpenSSL-Win32/include'

новые ошибки (компилятор gcc 32 бит)

error: undefined reference to `td::ClientManager::execute(td::tl::unique_ptr<td::td_api::Function>&&)'
debug/TdController.o: In function `ZN12TdControllerC2Ev':
error: undefined reference to `td::td_api::setLogVerbosityLevel::setLogVerbosityLevel(int)'
debug/TdController.o: In function `ZN2td6td_api11make_objectINS0_20setLogVerbosityLevelEJiEEENS_2tl10unique_ptrIT_EEDpOT0_':
error: undefined reference to `vtable for td::td_api::setLogVerbosityLevel'
debug/TdController.o: In function `ZN2td6td_api20setLogVerbosityLevel

D1Ev':


person Powdermist    schedule 28.03.2021    source источник


Ответы (1)


Я не знаю этих библиотек, но согласно этому https://core.telegram.org/tdlib/docs/classtd_1_1td__api_1_1tdlib_parameters-members.html отсутствующий символ взят из td_api, который, похоже, не связан. Вы пытались ссылаться на другие библиотеки, в частности на tdapi.lib?

person Luca Carlon    schedule 28.03.2021
comment
Привет. спасибо за ответ. Я добавил -ltdapi и удалил ошибку с tdlibParameters, но все равно остались ошибки с Client , поэтому я добавил -ltdclient и появились новые ошибки, после этого я добавил все файлы .lib в файл .pro и получил много новых ошибок ссылок. - person Powdermist; 28.03.2021
comment
Если ошибки ссылок не связаны между собой, вам, вероятно, следует задать новый вопрос. - person Luca Carlon; 28.03.2021
comment
ошибки ссылок, связанные с Tdlib - person Powdermist; 28.03.2021
comment
Затем вы можете добавить эти ошибки к своему вопросу. - person Luca Carlon; 28.03.2021
comment
Я ошибся, когда добавил ссылку на библиотеку Telegram. Все эти файлы (tdactor.lib, tdapi.lib, tdclient.lib, tdcore.lib, tddb.lib, tdjson.lib, tdjson_private.lib, tdjson_static.lib, tdnet.lib, tdsqlite.lib, tdutils.lib) являются статические библиотеки и должны связывать их как статические библиотеки. Я добавил все эти библиотеки в файл .pro. вот обновленный файл .pro. Но у меня все еще есть некоторые ошибки связывания. я поставил их выше - person Powdermist; 07.06.2021
comment
Обратите внимание, что даже порядок может иметь значение, если библиотеки являются статическими. Я также предлагаю указать точное имя файла, включая расширение: stackoverflow.com/q/1361229/427544. - person Luca Carlon; 08.06.2021