Страницы

Поиск по вопросам

понедельник, 22 апреля 2019 г.

C++ Qt - неразрешенный внешний символ

Сразу хочу сказать, что это я читал: Ссылка на неразрешенный внешний символ (возможные причины) Однако проблемы с классами Qt(который, по идее, свои библиотеки линкует автоматически)
Несколько ошибок:
testclass.obj:-1: ошибка: LNK2019: ссылка на неразрешенный внешний символ "__declspec(dllimport) public: __cdecl QTcpSocket::QTcpSocket(class QObject *)" (__imp_??0QTcpSocket@@QEAA@PEAVQObject@@@Z) в функции "public: __cdecl TestClass::TestClass(class QString)" (??TestClass@@QEAA@VQString@@@Z) testclass.obj:-1: ошибка: LNK2019: ссылка на неразрешенный внешний символ "__declspec(dllimport) public: virtual __cdecl QTcpSocket::~QTcpSocket(void)" (__imp_??1QTcpSocket@@UEAA@XZ) в функции "public: virtual void * __cdecl QTcpSocket::`scalar deleting destructor'(unsigned int)" (??_GQTcpSocket@@UEAAPEAXI@Z) testclass.obj:-1: ошибка: LNK2001: неразрешенный внешний символ ""public: virtual bool __cdecl QAbstractSocket::atEnd(void)const " (?atEnd@QAbstractSocket@@UEBA_NXZ)"
И прочие ошибки в том же стиле. Кто может сказать, что не так с include-ами?
#include #include #include #include #include "testclass.h"
Пробовал подключать еще QAbstactSocket, не особо помогло (к слову он напрямую в коде не используется)


Ответ

Подключение библиотеки в C++ делается в два этапа:
для компилятора - пишется нужный #include для компоновщика - дописывается соответствующий параметр командной строки
В Qt за параметры командной строки отвечает система сборки. Ей управляет файл проекта с расширением pro. В нем есть директива QT= core gui [...]. Чтобы стали доступны сетевые функции, туда нужно дописать network
Чтобы библиотека вошла в состав exe, нужно компоновать проект с Qt статически. Для этого требуется:
соблюсти условия LGPL (опубликовать объектные файлы) собрать Qt статически, что является нетривиальной задачей.
Для Windows
Чтобы подготовить комплект dll для выпуска exe, существует утилита windeployqt, входящая в состав Qt. Статья о ней
Для Linux
Все зависит от целевого дистрибутива. В общих чертах, вы распространяете только ваш бинарник, а в пакете указываете зависимости от нужных библиотек. Остальное решает система управления зависимостями дистрибутива.
Для Mac
Аналогично Windows, только утилита называется macdeployqt
Еще одна статься о подготовке к релизу

Комментариев нет:

Отправить комментарий