Я создаю модуль Python, который хотел бы распространить на несколько дистрибутивов Linux, некоторые из которых будут иметь менее свежие версии gcc, чем я создаю, поэтому я использую ManyLinux . В частности, я использую Manylinux_2_28, который основан на alma (семейство Red Hat) и предоставляет gcc12.
Загрузив образ, я клонировал свой репозиторий и почти заставил конфигурацию CMake работать. Проблема начинается с
find_package(Python3 ${REQUESTED_PYTHON_VERSION} COMPONENTS Interpreter Development)
который дает
Could NOT find Python3 (missing: Python3_LIBRARIES Development Development.Embed) (found version "3.12.3")
и впоследствии возникают ошибки конфигурации при добавлении pybind11.
Изображение предоставляет Python
CPython 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12, 3.13 и PyPy 3.7, 3.8, 3.9, 3.10 установлены в /opt/python/-. Каталоги названы в честь тегов PEP 425 для каждой среды, например. /opt/python/cp37-cp37m содержит сборку CPython 3.7 и может использоваться для создания колес с именем типа --cp37-cp37m-.whl.
поэтому перед моей конфигурацией я добавляю к своему PATH префикс /opt/python/cp312-cp312/bin, чтобы which python3 => /opt/python/cp312-cp312/bin/python3.
Мой первоначальный вопрос заключался в том, как решить эту проблему. Однако, проведя дополнительные поиски, я нашел ответ в дискурсе CMake. Т.е. используйте Development.Module вместо Development.
find_package(Python3 ${REQUESTED_PYTHON_VERSION} COMPONENTS Interpreter Development.Module)
Как я и надеялся, разработка Python уже доступна для каждой версии. Но что здесь происходит? Что на самом деле ищет CMake и что он находит с помощью Development.Module, а не Development, и какие базовые файлы нужны gcc/компоновщику - предположительно, это файлы, присутствующие в include и lib в /opt/python/cp312-cp312/?
Development состоит из Development.Module и Development.Embed. Первый предназначен для создания модулей Python, второй — для создания программы, включающей интерпретатор Python. В Manylinux есть библиотеки для создания модулей, но нет библиотек для встроенного Python.





Начиная с CMake 3.18, модуль FindPython разделяет Development на Development.Module и Development.Embed. Первый предназначен для создания модулей Python, второй — для создания программы, включающей интерпретатор Python.
В Manylinux есть библиотеки для создания модулей, но нет библиотек для встроенного Python. Итак, в Manylinux вы должны использовать Development.Module.
Кстати, вместо find_package(Python …) следует использовать find_package(Python3 …). Модули FindPython2 и FindPython3 необходимы, когда необходимо одновременно управлять Python 2 и 3. Python 2 уже давно устарел, сейчас Python всегда остается Python 3. Если не использовать повсюду явно «Python 3», будет проще перейти на Python 4, когда он появится.
Спасибо и хороший комментарий за использование find_package(Python...), хотя последние новости Я вижу, что Python4 может никогда не появиться.
@TooTone Учитывая негативную реакцию, вызванную 3, я не виню их за нежелание делать 4. :)
рассмешил меня в тот день, когда мне это было нужно :)
Я должен сказать, что многие Linux работают невероятно хорошо. Создавая свой модуль Python в Ubuntu 22.04 с gcc11, я вижу
GLIBCXX_3.4.30в своем двоичном файле, тогда как во многих Linux с gcc12 (!) самый высокий символ —GLIBCXX_3.4.22.