#python-3.x #macos #ld
Вопрос:
Я пытаюсь создать модуль c в macOS. Сборка завершается неудачно во время процесса компоновщика с ошибкой:
ld: warning: object file (build/temp.macosx-11.1-x86_64-3.7/pparser.o) was built for newer macOS version (11.1) than being linked (11.0)
Я понимаю, что это просто предупреждение, но полученный файл so не удается импортировать в скрипт python. Я выполняю сборку со следующим setup.py
from distutils.core import setup, Extension
setup(name='pparser', version='1.0',
ext_modules=[Extension('pparser',
['pparser.cpp'],
extra_compile_args = ["-Wno-nullability-completeness",
"-Wno-undef-prefix",
"-I/usr/local/opt/flex/include",
"-I/usr/local/opt/bison/include",
"-std=gnu 14"])])
Что странно, так это то, что я могу захватить вызов clang и запустить его сам в командной строке с помощью опции verbose
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c -bundle -undefined dynamic_lookup -L/Users/john/.pyenv/versions/3.7.9/lib -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk -std=gnu 14 -L/usr/local/opt/readline/lib -L/Users/john/.pyenv/versions/3.7.9/lib -L/usr/local/opt/tcl-tk/lib build/temp.macosx-11.1-x86_64-3.7/pparser.o -o build/lib.macosx-11.1-x86_64-3.7/pparser.cpython-37m-darwin.so --verbose
и я вижу следующее:
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -dynamic -arch x86_64 -bundle -platform_version macos 11.0.0 11.3 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk -undefined dynamic_lookup -undefined dynamic_lookup -o build/lib.macosx-11.1-x86_64-3.7/pparser.cpython-37m-darwin.so -L/Users/john/.pyenv/versions/3.7.9/lib -L/usr/local/opt/readline/lib -L/Users/john/.pyenv/versions/3.7.9/lib -L/usr/local/opt/tcl-tk/lib build/temp.macosx-11.1-x86_64-3.7/pparser.o -lc -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/12.0.5/lib/darwin/libclang_rt.osx.a
Я подозреваю, что проблема заключается в версии macOS 11.0.0 11.3 для коммутатора ld, но откуда это взялось? Этого нет ни в файле установки, ни в командной строке, которую я ввел.
Моя настройка-заварить python 3.7.9 в виртуальной среде pyenv.
Любая помощь в понимании того, откуда программа установки python извлекает параметры командной строки, была бы весьма полезна.
Ответ №1:
Покопавшись еще немного, я нашел ответ здесь:
Настройка компилятора и компоновщика, используемых setuptools
Похоже, что CPython создает файл sysconfig, содержащий все переменные среды, используемые для его компиляции. Затем они используются python при создании установочного файла.
Вы можете просмотреть эти переменные в python:
import distutils.sysconfig
distutils.sysconfig.get_config_var()
Далее автор описывает, как переопределить любую желаемую переменную.