gpt4 book ai didi

python - 如何判断将为 Python C 扩展 : GCC or Clang? 调用哪个特定编译器

转载 作者:太空狗 更新时间:2023-10-29 20:30:34 24 4
gpt4 key购买 nike

我有一个 Python C++ 扩展,在 OS X 上使用 Clang 编译时需要以下编译标志:

CPPFLAGS='-std=c++11 -stdlib=libc++ -mmacosx-version-min=10.8'
LDFLAGS='-lc++'

在我的 setup.py 中检测 OS X 非常简单。我可以这样做:

if sys.prefix == 'darwin':
compile_args.append(['-mmacosx-version-min=10.8', '-stdlib=libc++'])
link_args.append('-lc++')

(有关完整上下文,请参阅 here)

但是,在 GCC 上这个编译标志是无效的。因此,如果我以这种方式编写 setup.py,如果有人试图在 OS X 上使用 GCC,编译将失败。

GCC 和 Clang 支持不同的编译器标志。因此,我需要知道将调用哪个编译器,以便我可以发送不同的标志。在 setup.py 中检测编译器的正确方法是什么?

编辑 1:
请注意,编译错误不会引发 Python 异常:

$ python setup.py build_ext --inplace
running build_ext
building 'spacy.strings' extension
gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -c spacy/strings.cpp -o build/temp.linux-x86_64-2.7/spacy/strings.o -O3 -mmacosx-version-min=10.8 -stdlib=libc++
gcc: error: unrecognized command line option ‘-mmacosx-version-min=10.8’
gcc: error: unrecognized command line option ‘-stdlib=libc++’
error: command 'gcc' failed with exit status 1
$

最佳答案

我突然想到了你的问题,因为我需要同样的开关。此外,在我的例子中,sys.prefix 不是很好,因为无论平台如何,标志都是针对 clang 的。

我不确定它是否完美,但这是最适合我的。因此,我检查是否设置了 CC 变量;如果没有,我会检查我猜想 distutils 看的地方。

欢迎任何更好的解决方案!

import os
import distutils

try:
if os.environ['CC'] == "clang":
clang = True
except KeyError:
clang = False

if clang or distutils.sysconfig_get_config_vars()['CC'] == 'clang':
try:
_ = os.environ['CFLAGS']
except KeyError:
os.environ['CFLAGS'] = ""
os.environ['CFLAGS'] += " -Wno-unused-function"
os.environ['CFLAGS'] += " -Wno-int-conversion"
os.environ['CFLAGS'] += " -Wno-incompatible-pointer-types

脾气暴躁的家伙请注意:我很想使用 extra_compile_args 选项,但它会将标志放在 clang 编译命令。

关于python - 如何判断将为 Python C 扩展 : GCC or Clang? 调用哪个特定编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28641408/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com