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 回调段错误

OSX 的 Cython 链接错误

在 Cython 中使用 C++ STL 映射

Cython:啥类似于 C 包含守卫?

Cython 将双复数返回到浮点复数导致表达式不在纯 C 中

Cython 中的枚举成员名称重复 - 重新声明错误?