Cython не распознает команды С++ 11

Я оборачиваю класс C++ в Python и не могу скомпилировать какие-либо функции C++11 с модулем Cython.

Все компилируется нормально при компиляции только C++. Но когда я запускаю этот setup.py ниже:

setup(
    ext_modules = cythonize(
       "marketdata.pyx",            # our Cython source
       sources=["cpp/OBwrapper.cpp, cpp/OrderBook/orderbook.h, cpp/OrderBook/orderbook.cpp"],  # additional source file(s)
       language="c++",             # generate C++ code
       extra_compile_args=["-std=c++11"]
    ))

В моем заголовке файла .pyx:

# distutils: language = c++
# distutils: sources = cpp/OBwrapper.cpp cpp/OrderBook/orderbook.cpp

Я получаю массу ошибок, связанных с тем, что они не распознают команды С++ 11, такие как «авто».

Например:

cpp/OrderBook/orderbook.cpp(168) : error C2065: 'nullptr' : undeclared identifier

Как я могу заставить это работать?


person The Dude    schedule 04.12.2014    source источник
comment
Я думаю, что это сообщение об ошибке Microsoft, а -std=c++11 — это вариант компиляции GNU.   -  person Fred Larson    schedule 05.12.2014
comment
@FredLarson: я так не думаю, я получаю эту ошибку в Linux. cythonize просто игнорирует extra_compile_args. См. также этот ответ.   -  person bluenote10    schedule 19.09.2016
comment
@bluenote10: error C2065 — это сообщение об ошибке Visual Studio. Я был бы удивлен, увидев это в Linux.   -  person Fred Larson    schedule 20.09.2016
comment
@FredLarson: Конечно, ошибка другая, но причина та же: компилятор вызывается без -std=c++11. Хотя вы говорите, что cythonize на самом деле действительно передает extra_compile_args компилятору, и ошибка вызвана конкретным компилятором...   -  person bluenote10    schedule 20.09.2016
comment
@ bluenote10: я только что заметил очевидное несоответствие между сообщением об ошибке и переключателем компилятора. -std=c++11 будет применяться к GNU, и мне кажется, что у MSVC даже не было переключателя стандартной версии до Visual C++ 2015 Update 3. Я ничего не знаю о cythonize.   -  person Fred Larson    schedule 20.09.2016


Ответы (1)


Попробуйте использовать Extension: setup(ext_modules=cythonize([Extension(...)], ...).

Это setup.py работает для меня (в Debian Linux):

from setuptools import setup, find_packages, Extension
from Cython.Build import cythonize
from glob import glob

extensions = [
    Extension(
        'my_proj.cython.hello',
        glob('my_proj/cython/*.pyx')
        + glob('my_proj/cython/*.cxx'),
        extra_compile_args=["-std=c++14"])
]

setup(
    name='my-proj',
    packages=find_packages(exclude=['doc', 'tests']),
    ext_modules=cythonize(extensions))
person Messa    schedule 19.08.2016