python-3.x - 在 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 设置从何处提取命令行选项的帮助都会非常有帮助。
解决方案
经过更多挖掘,我在这里找到了答案:
似乎 CPython 创建了一个 sysconfig 文件,其中包含用于编译它的所有环境变量。然后在构建设置文件时,python 会使用这些。
您可以在 python 中查看这些变量:
import distutils.sysconfig
distutils.sysconfig.get_config_var()
作者继续描述如何覆盖所需的任何变量。
推荐阅读
- java - 当 uri 值在 Kotlin 中有数据时启用按钮
- javascript - JavaScript NPM 包,用于转义 xml 以处理特殊字符,但不理会 xml 标签
- python - 检查数量是否在python中的品脱测量范围内
- java - java: 无法访问 com.google.auth.Credentials 类文件,因为找不到 com.google.auth.Credentials
- r - R - 是否有一种矢量化方式/预制函数可以快速生成两个向量之间的唯一集?
- python - 'NoneType' 不是 for 循环的可迭代错误
- java - Maven 无法在终端中找到 io.reactivex.subjects,在 Eclipse 中成功
- angular - SyntaxError:JSON.parse 中位置 0 处的 JSON 中的意外标记 h:平均堆栈
- bash - 外壳,管道接收端的作业控制
- c# - 自定义 Json.NET 转换器不应序列化属性