Cython -std=c++11 错误,同时使用 C 和 C++
Posted
技术标签:
【中文标题】Cython -std=c++11 错误,同时使用 C 和 C++【英文标题】:Cython -std=c++11 error, using both C and C++ 【发布时间】:2018-02-27 03:33:25 【问题描述】:我是 Cython 的新手,我正在尝试从 this project 编译 Cython,但没有成功。
有了这个 setup.py,
from distutils.core import setup, Extension
from Cython.Distutils import build_ext
from distutils.extension import Extension
sources_list = ["timgraph.pyx", "Graph.cpp", "InfGraph.cpp", "sfmt/SFMT.c"]
setup(ext_modules=[Extension("pytim",
sources=sources_list,
language="c++",
extra_compile_args=["-std=c++11"])
],
cmdclass='build_ext':build_ext)
我运行以下命令:
python setup.py build_ext --inplace
并得到以下错误:
error: invalid argument '-std=c++11' not allowed with 'C/ObjC'
error: command 'clang' failed with exit status 1
我正在运行 macOS High Sierra 10.13.2、Python 3.6.2、Cython 0.27.3 和 Apple LLVM 9.0.0 版,以防万一。
编辑: 我想可能是因为尝试同时编译 C 和 C++,因为我可以运行 Cython example for C++ 并且它工作正常。但我不知道如何解决 extra_compile_args 适用于所有来源的事实,包括“sfmt/SFMT.c”。
【问题讨论】:
Clang
是一个 C 编译器;指定 C++ 标准的版本是一个坏主意。使用Clang++
或指定-std=c11
。
@JonathanLeffler 如果我指定 -std=c11,那么它会返回 error: invalid argument '-std=c11' not allowed with 'C++/ObjC++'
。如何指定 Clang++?
确保使用Clang++
。文件以.cpp
结尾,因此请使用 C++ 编译器进行编译。
@JonathanLeffler Cython 不要求编译器,它只是自动完成,所以我不知道如何分别为 .cpp 文件指定编译器。此外,我为 C++ 运行了 Cython example,它在没有指定 C++ 编译器的情况下运行良好,所以这对我来说听起来不对。
@ead 显然不是,使用 gcc 我仍然得到 error: invalid argument '-std=c++11' not allowed with 'C/ObjC'
和 error: command 'gcc' failed with exit status 1
【参考方案1】:
为了记录,解决方法很简单:完全删除extra_compile_args
参数,但仍将语言参数设置为c++
,即
from distutils.core import setup, Extension
from Cython.Distutils import build_ext
from distutils.extension import Extension
sources_list = ["timgraph.pyx", "Graph.cpp", "InfGraph.cpp", "sfmt/SFMT.c"]
setup(ext_modules=[Extension("pytim",
sources=sources_list,
language="c++")
],
cmdclass='build_ext':build_ext)
无论出于何种原因,这都成功地编译了 C 和 C++。
【讨论】:
可能是因为对于您当前的编译器版本,-std=c++11
是默认值。【参考方案2】:
在 Python 3.7 和 3.6.5 及更高版本中遇到相同的问题...
我尝试运行时出错:
pip install python-crfsuite
那是从那里的 setup.py 文件派生出来的...
错误:
error: invalid argument '-std=c99' not allowed with 'C++/ObjC++'
唯一对我有用的是用 Python 3.6.4 运行它
转到here 安装3.6.4,然后重试。
或者在这里用 Conda/Anaconda 来做
如果您在 Python3.7 上遇到 pkgs 问题并且您有 mac 尝试解决它:
python location on mac osx
【讨论】:
仅供参考,这是不必要的,因为我在 Python 3.6.2 上使用它。您的问题似乎有点不同,并且 pip 安装时没有出现错误。以上是关于Cython -std=c++11 错误,同时使用 C 和 C++的主要内容,如果未能解决你的问题,请参考以下文章
使用 python-c-api 调用的 Cython 回调段错误