首页 > 解决方案 > 在 MacOS 中构建 python 3 c 模块 - 使用奇怪的编译器选项进行设置

问题描述

我正在尝试在 MacOS 中构建 ac 模块。在链接器过程中构建失败并出现错误:

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 调用并使用详细选项在命令行中自己运行它

/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

我怀疑问题出在 ld switch -platform-version macOS 11.0.0 11.3 但它来自哪里?它不在我输入的设置文件或命令行中。

我的设置是在 pyenv 虚拟环境中 brew python 3.7.9。

任何有关了解 python 设置从何处提取命令行选项的帮助都会非常有帮助。

标签: python-3.xmacosld

解决方案


经过更多挖掘,我在这里找到了答案:

自定义 setuptools 使用的编译器和链接器

似乎 CPython 创建了一个 sysconfig 文件,其中包含用于编译它的所有环境变量。然后在构建设置文件时,python 会使用这些。

您可以在 python 中查看这些变量:

import distutils.sysconfig
distutils.sysconfig.get_config_var()

作者继续描述如何覆盖所需的任何变量。


推荐阅读