Shiboken6: переменная constexpr должна быть инициализирована постоянным выражением

Я пытаюсь создать несколько оболочек Python, используя shiboken6 и Pyside6. Мне удалось скомпилировать код на одной машине, но теперь, когда я перенес код на сервер сборки, я получаю ошибку компиляции внутри компилятора shiboken:

QtCore/qplugin.h(146,33): ошибка G3F63BFAE: переменная constexpr 'HeaderOffset' должна быть инициализирована постоянным выражением

Кажется, этот код отлично работает на эталонной машине, но я не знаю, чем отличается установка. Я установил среду conda из файла .yml, созданного на рабочей машине, на новую машину:

channels:
  - defaults
dependencies:
   ... // omitted most packages for brevity
  - pip=24.0=py312haa95532_0
  - pybind11-abi=5=hd3eb1b0_0
  - python=3.12.4=h14ffc60_1
  ... // omitted most packages for brevity
  - pip:
      - pyside6==6.7.2
      - shiboken6==6.7.2
      - shiboken6-generator==6.7.2

Я передаю шибокэну следующие параметры:

C:/ProgramData/Miniconda3/envs/myenv/Lib/site-packages/shiboken6_generator/shiboken6.exe 
--generator-set=shiboken 
--compiler=msvc
--enable-parent-ctor-heuristic
--enable-return-value-heuristic
--use-isnull-as-nb_nonzero
--enable-pyside-extensions
--avoid-protected-hack
--debug-level=full
--output-directory=build/x64/Release/
-TD:/myrepo/myproject/src/core/python_core/
-TC:/ProgramData/Miniconda3/envs/myenv/Lib/site-packages/PySide6/typesystems
-ID:/myrepo/myproject/src/core/python_core/
-IC:/ProgramData/Miniconda3/envs/myenv/Lib/site-packages/shiboken6_generator/include
-IC:/ProgramData/Miniconda3/envs/myenv/Lib/site-packages/PySide6/include
-IC:/ProgramData/Miniconda3/envs/myenv/include
-IC:/ProgramData/Miniconda3/envs/myenv/Lib/site-packages/PySide6/include/QtCore 
-IC:/ProgramData/Miniconda3/envs/myenv/Lib/site-packages/numpy/core/include 
-IC:/Qt/6.7.2/msvc2019_64/include/QtXml 
-IC:/Qt/6.7.2/msvc2019_64/include/QtGui 
-IC:/Qt/6.7.2/msvc2019_64/include/QtCore
-IC:/Qt/6.7.2/msvc2019_64/include/QtQml
-IC:/Qt/6.7.2/msvc2019_64/include 
bindings.h 
bindings.xml

Что должно быть довольно стандартно. Я не уверен, что вызывает проблему, поскольку определение offsetof идентично на двух машинах:

#if defined _MSC_VER && !defined _CRT_USE_BUILTIN_OFFSETOF
    #ifdef __cplusplus
        #define offsetof(s,m) ((::size_t)&reinterpret_cast<char const volatile&>((((s*)0)->m)))
    #else
        #define offsetof(s,m) ((size_t)&(((s*)0)->m))
    #endif
#else
    #define offsetof(s,m) __builtin_offsetof(s,m)
#endif

Меня смущает то, что я нахожу вопросы, связанные с тем, что reinterpret_cast не является частью действительного constexpr (см. этот другой пост о stackoverflow). Это означало бы, что ни при каких обстоятельствах это не должно компилироваться. Однако одна машина это делает, а другая нет.

Обратите внимание, что опция --compiler была добавлена ​​только как попытка исправить проблему и изменить ошибку. Когда ничего не указано или когда передана опция msvc, я получаю ошибку выше. Передача значения --compiler=clang приводит к еще более загадочной ошибке.

C1083 Невозможно открыть исходный файл «С++».

Я использую Visual Studio 2019 (версия 16.11.35) для компиляции полученного кода оболочки Python и Qt 6.7.2 в обеих установках.

Единственная связанная проблема, которую я смог найти, — это проблема из списка рассылки ITK за 2017 год: https://itk.org/pipermail/community/2017-May/013075.html цитата: «это известная ошибка в VS2017»

Есть ли у кого-нибудь идеи, в чем может быть проблема? Это ошибка в qplugin.h? Или мне не хватает конфигурации, которая присутствует на одной машине, но отсутствует на другой? Это проблема с MSVC?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Причину проблемы я не нашел, но нашел обходной путь. Прохождение --clang-options=-D _CRT_USE_BUILTIN_OFFSETOF решает проблему. Как ни странно, у меня сложилось впечатление, что shiboken6 внутренне использует clang, поэтому я не знаю, почему это позволяет ему использовать реализацию clang, а раньше — нет.

Другие вопросы по теме

Похожие вопросы

Почему предел максимальной глубины рекурсии в Python 2 ** 32/2 - 31?
Как рассчитать индекс относительной силы (RSI) с помощью итераций записи в фрейме данных pandas
Как устранить ошибку «Необходимо указать, как согласовать расходящиеся ветки» при перебазировании в Git?
Как сгруппировать строки на основе идентификатора столбца в фрейме данных pandas?
Интерпретация битовых данных в Python с помощью структур и ctypes: невыровненные результаты
Мой чат-сервер Python не отправляет сообщения должным образом
Как сообщить средству проверки типов тип вывода внешней функции
Разделить фрейм данных pandas на основе заданной строки строки
Как объединить подсказку типа с использованием переменной связанного типа и статических типов для максимальной гибкости?
Сравните строки из очень большого текстового файла (более 100 ГБ) с небольшим текстовым файлом (около 30 строк) и распечатайте все строки, содержащиеся в обоих файлах