Qmake не связывает статическую библиотеку Qt - PullRequest
0 голосов
/ 07 июля 2019

Я собираю пример структуры проекта для стека настольных приложений, включая Qt, Googletest, CMake и C ++.Цель здесь - создать кроссплатформенную структуру проекта, которую люди могут скопировать из github, чтобы вставить свой код для своей статической библиотеки C или C ++ (используемой их пользовательским интерфейсом), автоматизированное модульное тестирование для своей библиотеки и код пользовательского интерфейса (Qt5) вхорошо организованный пример проекта.В конце концов я напишу сценарии (или использую RPM), чтобы снять зависимости для проекта, построить статическую библиотеку проекта и связать ее с пользовательским интерфейсом, который также упаковывается в исполняемый файл.

У меня есть все частистека работает хорошо, кроме Qt.Я не хочу использовать QtCreator, потому что это создает дополнительное усложнение зависимости и немного увеличивает размер установки, поэтому я компилирую все в командной строке.Как в Windows, так и в Linux (Ubuntu) у меня есть проблема, когда после создания каталога выпуска или файла сборки с помощью qmake, объектный файл или файл сборки (соответственно) не связывают Qt с проектом.Как мне сказать qmake связать библиотеки (включая сам Qt) в make-файле или объектном файле, который он создает?

В качестве дополнительного фона я использую Designer для создания .ui-файлов для проекта.Я превращаю их в заголовочные файлы, используя

uic -o ui_mainwindow.h mainwindow.ui

Предполагая, что статическая библиотека для фактической части кода проекта уже скомпилирована, мои шаги сборки для пользовательского интерфейса:

qmake -project
qmake ui.pro
nmake release

И вывод, который я получаю:

cl -c -nologo -Zc:wchar_t -FS -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus -O2 -MD -W3 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 -wd4577 -wd4467 -EHsc -DUNICODE -D_UNICODE -DWIN32 -D_ENABLE_EXTENDED_ALIGNED_STORAGE -DQT_DEPRECATED_WARNINGS -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -I. -I. -IC:\qt5\qtbase\include -IC:\qt5\qtbase\include\QtGui -IC:\qt5\qtbase\include\QtCore -Irelease -IC:\qt5\qtbase\mkspecs\win32-msvc -Forelease\ @C:\Users\User\AppData\Local\Temp\nmA4E2.tmp                                                   mainwindow.cpp                                                                                                                  
link /NOLOGO /DYNAMICBASE /NXCOMPAT /INCREMENTAL:NO /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" /MANIFEST:embed /OUT:release\ui.exe @C:\Users\User\AppData\Local\Temp\nmAACF.tmp                                   
mainwindow.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall QWidget::QWidget(class QWidget *,class QFlags<enum Qt::WindowType>)" (__imp_??0QWidget@@QAE@PAV0@V?$QFlags@W4WindowType@Qt@@@@@Z) referenced in function "public: void __thiscall Ui_MainWindow::setupUi(class QMainWindow *)" (?setupUi@Ui_MainWindow@@QAEXPAVQMainWindow@@@Z)                                                                                                            
mainwindow.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual __thiscall QWidget::~QWidget(void)" (__imp_??1QWidget@@UAE@XZ) referenced in function "public: virtual void * __thiscall QWidget::`scalar deleting destructor'(unsigned int)" (??_GQWidget@@UAEPAXI@Z) 

, за которым следует еще много ошибок того же типа LNK2019, что указывает на то, что Qt не связан должным образом.Эта сборка для Windows 10, но очень похожие ошибки происходят в Ubuntu 16.04

На всякий случай, если что-то не так в моем коде, а не в ссылках, вот мой файл mainwindow.cpp:

#include <QtWidgets/QMainWindow>
#include <QtWidgets/QApplication>
#include "ui_mainwindow.h"

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QMainWindow *window = new QMainWindow;
    Ui::MainWindow ui;
    ui.setupUi(window);
    window->show();
    return app.exec();
}

Файл ui_mainwindow.h сгенерирован uic из файла пользовательского интерфейса Qt designer, и он очень длинный, поэтому я не буду его здесь включать.

Так что просто для повторения вопроса ради избыточности,как мне сказать qmake связать библиотеки (включая сам Qt) в make-файле или объектном файле, который он собирает?

...