4

Сразу хочу сказать, что это я читал: Ссылка на неразрешенный внешний символ (возможные причины) Однако проблемы с классами 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 <QtNetwork/QTcpSocket>
#include <QDataStream>
#include <QDateTime>
#include <iostream>
#include "testclass.h"

Пробовал подключать еще QAbstactSocket, не особо помогло (к слову он напрямую в коде не используется)

user64675
  • 1,281
  • При чём тут инклуды? У вас библиотека не линкуется, в которой сокеты живут. Кстати, первый же пункт по ссылке, которую вы "читали". – PinkTux Jun 23 '16 at 03:50
  • И как узнать имя нужной библиотеки? – user64675 Jun 23 '16 at 03:56

1 Answers1

7

Подключение библиотеки в C++ делается в два этапа:

  • для компилятора - пишется нужный #include
  • для компоновщика - дописывается соответствующий параметр командной строки

В Qt за параметры командной строки отвечает система сборки. Ей управляет файл проекта с расширением pro. В нем есть директива QT= core gui [...]. Чтобы стали доступны сетевые функции, туда нужно дописать network

Чтобы библиотека вошла в состав exe, нужно компоновать проект с Qt статически. Для этого требуется:

  • соблюсти условия LGPL (опубликовать объектные файлы)
  • собрать Qt статически, что является нетривиальной задачей.

Для Windows

Чтобы подготовить комплект dll для выпуска exe, существует утилита windeployqt, входящая в состав Qt. Статья о ней.

Для Linux

Все зависит от целевого дистрибутива. В общих чертах, вы распространяете только ваш бинарник, а в пакете указываете зависимости от нужных библиотек. Остальное решает система управления зависимостями дистрибутива.

Для Mac

Аналогично Windows, только утилита называется macdeployqt

Еще одна статься о подготовке к релизу

gbg
  • 22,253
  • Спасибо, компилируется но не запускается. "запуск невозможен т.к. на компьютере отсутствует Qt5Network.dll". Мне казалось, библиотека войдет в состав exe? – user64675 Jun 23 '16 at 04:08
  • А что делать для других платформ (aka Linux)? – user64675 Jun 23 '16 at 04:19
  • @user64675 зависит от целевого дистрибутива, дополнил ответ – gbg Jun 23 '16 at 04:29
  • @gbg, попытки слинковать Qt статически под Linux делались, на киберфоруме ман про Qt5 есть. Но: 1) это слишком геморройно (нужно как минимум пересобирать Qt полностью) 2) не избавляет от кучи других зависимостей. В общем, нафиг надо :) – PinkTux Jun 23 '16 at 04:35
  • @Pink Tux Qt статически я компоновал, причем делал это под linux, кросс-компилятором для Windows (mingw). Под linux это делается более удобным способом, правда, бинарники получаются по 10 мегабайт. – gbg Jun 23 '16 at 04:37
  • 1
    @gbg mingw собирает бинарики для винды. и запускать их можно любо под виндой же, либо под вайном. А вот сам mingw является кроссплатформенным, т. е. имеет отдельные сборки для винды и для linux-а. – tonal Jun 23 '16 at 06:09
  • @user64675 Для того, чтобы dll-ка находилась при запуске, путь, по которому она лежит нужно добавить в PATH. Обычно это %QTDIR\bin По идее это должен делать инсталятор. Но если ты разворачивал руками, то добавь путь сам.

    На linux, по хорошему, после сборки приложения собирается пакет, для которого прописываются зависимые пакеты. При его установке пакетный менеджер выкачает и поставит их, или попросит поставить руками. :)

    – tonal Jun 23 '16 at 06:15