Ошибка сборки Qt-проекта при использовании QThread с использованием библиотек PostgreSQL 15 (win)
Прошу помощи в диагностике проблемы: Есть проект на Qt 5.14.2, который предполагается использовать в мультиплатформенном варианте. Проект рабочий и развивается. Использует прямой доступ к БД PostgreSQL 15 через ее нативные библиотеки.
Возникла необходимость перенести часть кода в параллельный поток используя QThread. При сборке в Linux все работает как предполагается, однако при сборке в Windows выдает массу ошибок не связанных с кодом самой программы (или связанных, но неявно).
Проблема начинается при попытке включить
#include <QThread>
. Компилятор выдает массу ошибок типа :
C:\Qt\Qt5.14.2\Tools\mingw730_64\lib\gcc\x86_64-w64-mingw32\7.3.0\include\c++\thread:276: ошибка: no match for 'operator==' (operand types are 'std::thread::native_handle_type {aka ptw32_handle_t}' and 'std::thread::native_handle_type {aka ptw32_handle_t}') In file included from C:/Qt/Qt5.14.2/Tools/mingw730_64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/future:39:0, from C:/Qt/Qt5.14.2/5.14.2/mingw73_64/include/QtCore/qthread.h:50, from C:/Qt/Qt5.14.2/5.14.2/mingw73_64/include/QtCore/QThread:1, from C:\Design\Qt....\src.cpp:3: C:/Qt/Qt5.14.2/Tools/mingw730_64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/thread: In function 'bool std::operator==(std::thread::id, std::thread::id)': C:/Qt/Qt5.14.2/Tools/mingw730_64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/thread:276:26: error: no match for 'operator==' (operand types are 'std::thread::native_handle_type {aka ptw32_handle_t}' and 'std::thread::native_handle_type {aka ptw32_handle_t}') return __x._M_thread == __y._M_thread; ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~
Гугл подсказывает, что возможно проблема в модели потоков, компилятор имеет POSIX модель, а какая у PostgreSQL 15 (win-64) я не нашел.
Кто-нибудь сталкивался с подобным и есть ли решение или посмотреть куда? Ссылка сойдет за ответ, читать умею. ))
Спасибо.
PS. Да, примерчик. Извините. Ничего особо умного, просто по документации:
есть объект, который должен загружать таблицу БД в фоне (таблица большая, критика типа "а зачем так делать" не относится к делу, так надо по условиям задачи). Заголовок:
#include <QVector>
#include <QUuid>
#include <QQueue>
/// Первоначальная мультипоточная загрузка сообщений
class clsLoader : public QObject
{
Q_OBJECT
public:
clsLoader(QVector<data*> *reciver = nullptr);
public slots:
void doLoad();
private:
QVector<data*> *recs;
signals:
void send(int count, int curr);
};
есть класс, который инициализирует загрузку:
class Datas : public BaseTable
{
Q_OBJECT
public:
...
private:
QThread * load_thread;
clsLoader * mtLoader;
private slots:
void update(int count, int curr);
};
В заголовке не приходится включать
#include <QThread>
Все определения находятся сами, хотя я и не понимаю как. В том же окне используется и реализация splashscreen, так что может быть и в этом дело, но почему тогда компилятор не видит нужных определений QThread в cpp - мне не понятно.
Зато приходится в .cpp
#include <QThread>
/// При создании экземпляра класса автоматически считываем всё содержимое таблицы в собственный массив
Datas::Datas(QSplashScreen *splash) :BaseTable()
{
load_thread = new QThread();
mtLoader = new clsLoader(&DataList);
mtLoader->moveToThread(load_thread);
connect(mtLoader, SIGNAL(send(int, int)), this, SLOT(update(int, int)));
connect(load_thread, SIGNAL(started()), mtLoader, SLOT(doLoad()));
load_thread->start();
return;
}
Как только я включаю указанную строку - при сборке вываливает указанную выше ошибку (-и) их там куча, привел в пример только первую.
Повторюсь, что ИМЕННО этот код при сборке под Linux Mint собирается без проблем и работает как ожидалось. При сборке под Win 10 x64 - не собирается. Проект использует подключение к PostgreSQL 15 x64 под win в Linux x64 но вроде 14 версия. Подключение в cmake:
Win:
target_link_libraries(prg PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Charts libpq )
Linux:
target_link_libraries(prg PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Charts pq )
UPD 1: Смена платформы на Qt 5.15.2. не дало положительного результата. Используемый компилятор:
gcc -v Using built-in specs.
...
**Target: x86_64-w64-mingw32**
...
**Thread model: posix** gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)
UPD 2: Перевел проект на сборку под MS VC 2022 - проблема решилась. В чем конкретно был косяк так и не понял. Использую для сборки (под Windows) Qt 5.15.2 собранную для компилятора Microsoft - все работает (ну не считая собственных ошибок). Вывод: совместимость MinGW компилятора оставляет желать лучшего. Так что комментаторы внизу были правы, хотя и очень обидно.