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