Я собираю Qt 4.6.4 из исходного кода для проекта. Я на Fedora 27 с выпуском ядра 4.14.6. Когда я пытаюсь бежать make
Я получаю следующие ошибки в QMap:
In file included from /usr/include/features.h:423:0,
from /usr/include/bits/libc-header-start.h:33,
from /usr/include/string.h:26,
from ../../include/QtCore/../../src/corelib/tools/qbytearray.h:48,
from ../../include/QtCore/qbytearray.h:1,
from ../../include/QtCore/../../src/corelib/tools/qstring.h:46,
from ../../include/QtCore/qstring.h:1,
from ../../include/QtCore/../../src/corelib/kernel/qobject.h:48,
from ../../include/QtCore/qobject.h:1,
from ../../include/QtCore/../../src/corelib/kernel/qcoreapplication.h:45,
from ../../include/QtCore/qcoreapplication.h:1,
from global/qt_pch.h:58:
../../include/QtCore/../../src/corelib/tools/qmap.h: In instantiation of ‘struct QMapPayloadNode<int, inotify_event>’:
../../include/QtCore/../../src/corelib/tools/qmap.h:151:48: required from ‘static int QMap<Key, T>::payload() [with Key = int; T = inotify_event]’
../../include/QtCore/../../src/corelib/tools/qmap.h:632:32: required from ‘void QMap<Key, T>::freeData(QMapData*) [with Key = int; T = inotify_event]’
../../include/QtCore/../../src/corelib/tools/qmap.h:167:67: required from ‘QMap<Key, T>::~QMap() [with Key = int; T = inotify_event]’
io/qfilesystemwatcher_inotify.cpp:359:30: required from here
/usr/include/sys/inotify.h:34:13: error: flexible array member ‘inotify_event::name’ not at end of ‘struct QMapPayloadNode<int, inotify_event>’
char name __flexarr; /* Name. */
Структура inotify_event имеет гибкий элемент массива в конце, называемый name, что хорошо:
/* Structure describing an inotify event. */
struct inotify_event
{
int wd; /* Watch descriptor. */
uint32_t mask; /* Watch mask. */
uint32_t cookie; /* Cookie to synchronize two events. */
uint32_t len; /* Length (including NULs) of name. */
char name __flexarr; /* Name. */
};
Но проблема в том, что структура QMapNode
включает в себя два экземпляра того, что передается как T
:
template <class Key, class T>
struct QMapNode {
Key key;
T value;
QMapData::Node *backward;
QMapData::Node *forward[1];
};
И в файле qfilesystemwatcher_inotify.cpp Qt пытается создать QMap с T = inotify_event, что приводит к двум экземплярам inotify_event, содержащимся в структурах QMapNode. Я предполагаю, что проблема здесь в том, что name
гибкий массив в конце backward
член в QMapNode вызывает ошибку.
Мой вопрос, как это вообще строилось? Было ли это вызвано каким-то новым изменением inotify.h после довольно старого выпуска Qt 4.6.4? Есть ли способ обойти это?
Задача ещё не решена.
Других решений пока нет …