[英]Why can I compile as C but not as C++ with Cython on Mac OS X
I am trying to figure out how to use C/C++ code in python using Cython. 我试图找出如何使用Cython在python中使用C / C ++代码。 I can get the following example working as C code:
我可以使用以下示例作为C代码:
sum.h: sum.h:
#ifndef MY_SUM_H_
#define MY_SUM_H_
int my_sum(int a, int b);
#endif
sum.c: sum.c:
int my_sum(int a, int b){
return a + b;
}
test.pyx: test.pyx:
cdef extern from "my_sum.h":
cdef int my_sum(int a, int b)
cpdef sum_wrap(int a, int b):
return my_sum(a, b)
setup.py: setup.py:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [Extension("test", ["test.pyx", "my_sum.c"], language = "c")]
setup(cmdclass = {'build_ext': build_ext}, ext_modules = ext_modules)
However, if I try to test it as C++ code it fails. 但是,如果我尝试将其作为C ++代码进行测试,则会失败。 I rename
sum.c
to sum.cpp
and change language
to c++
in setup.py. 我将
sum.c
重命名为sum.cpp
并在setup.py sum.cpp
language
更改为c++
。 After that, it looks like this: 之后,它看起来像这样:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [Extension("test", ["test.pyx", "my_sum.cpp"], language = "c++")]
setup(cmdclass = {'build_ext': build_ext}, ext_modules = ext_modules)
That should be enough right? 那应该够了吗? It produces the following error:
它会产生以下错误:
$ python setup.py build_ext --inplace
running build_ext
cythoning test.pyx to test.cpp
/Users/jensrenders/miniconda3/lib/python3.7/site-packages/Cython/Compiler/Main.py:367: FutureWarning: Cython directive 'language_level' not set, using 2 for now (Py2). This will change in a later release! File: /Users/jensrenders/Dropbox/cython_demo/test.pyx
tree = Parsing.p_module(s, pxd, full_module_name)
building 'test' extension
gcc -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/Users/jensrenders/miniconda3/include -arch x86_64 -I/Users/jensrenders/miniconda3/include -arch x86_64 -I/Users/jensrenders/miniconda3/include/python3.7m -c test.cpp -o build/temp.macosx-10.7-x86_64-3.7/test.o
warning: include path for stdlibc++ headers not found; pass '-std=libc++' on the command line to use the libc++ standard
library instead [-Wstdlibcxx-not-found]
1 warning generated.
gcc -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/Users/jensrenders/miniconda3/include -arch x86_64 -I/Users/jensrenders/miniconda3/include -arch x86_64 -I/Users/jensrenders/miniconda3/include/python3.7m -c my_sum.cpp -o build/temp.macosx-10.7-x86_64-3.7/my_sum.o
warning: include path for stdlibc++ headers not found; pass '-std=libc++' on the command line to use the libc++ standard
library instead [-Wstdlibcxx-not-found]
1 warning generated.
g++ -bundle -undefined dynamic_lookup -L/Users/jensrenders/miniconda3/lib -arch x86_64 -L/Users/jensrenders/miniconda3/lib -arch x86_64 -arch x86_64 build/temp.macosx-10.7-x86_64-3.7/test.o build/temp.macosx-10.7-x86_64-3.7/my_sum.o -o /Users/jensrenders/Dropbox/cython_demo/test.cpython-37m-darwin.so
clang: warning: libstdc++ is deprecated; move to libc++ with a minimum deployment target of OS X 10.9 [-Wdeprecated]
ld: library not found for -lstdc++
clang: error: linker command failed with exit code 1 (use -v to see invocation)
error: command 'g++' failed with exit status 1
I do get a test.cpp
file as output but no shared object. 我确实得到一个
test.cpp
文件作为输出但没有共享对象。 What causes this, and how can it be solved? 是什么导致这种情况,如何解决?
Thanks for your help! 谢谢你的帮助!
EDIT: As @MaximEgorushkin points out, it is strange that cython tries to compile the C++ files with gcc
. 编辑:正如@MaximEgorushkin指出的那样,很奇怪cython尝试用
gcc
编译C ++文件。 I can force it to use g++
by adding os.environ["CC"] = "g++"
to setup.py, but this does not solve the problem: 我可以通过在setup.py中添加
os.environ["CC"] = "g++"
来强制它使用g++
,但这并不能解决问题:
$ python setup.py build_ext --inplace
running build_ext
building 'test' extension
g++ -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/Users/jensrenders/miniconda3/include -arch x86_64 -I/Users/jensrenders/miniconda3/include -arch x86_64 -I/Users/jensrenders/miniconda3/include/python3.7m -c test.cpp -o build/temp.macosx-10.7-x86_64-3.7/test.o
warning: include path for stdlibc++ headers not found; pass '-std=libc++' on the command line to use the libc++ standard
library instead [-Wstdlibcxx-not-found]
1 warning generated.
g++ -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/Users/jensrenders/miniconda3/include -arch x86_64 -I/Users/jensrenders/miniconda3/include -arch x86_64 -I/Users/jensrenders/miniconda3/include/python3.7m -c my_sum.cpp -o build/temp.macosx-10.7-x86_64-3.7/my_sum.o
warning: include path for stdlibc++ headers not found; pass '-std=libc++' on the command line to use the libc++ standard
library instead [-Wstdlibcxx-not-found]
1 warning generated.
g++ -bundle -undefined dynamic_lookup -L/Users/jensrenders/miniconda3/lib -arch x86_64 -L/Users/jensrenders/miniconda3/lib -arch x86_64 -arch x86_64 build/temp.macosx-10.7-x86_64-3.7/test.o build/temp.macosx-10.7-x86_64-3.7/my_sum.o -o /Users/jensrenders/Dropbox/cython_demo/test.cpython-37m-darwin.so
clang: warning: libstdc++ is deprecated; move to libc++ with a minimum deployment target of OS X 10.9 [-Wdeprecated]
ld: library not found for -lstdc++
clang: error: linker command failed with exit code 1 (use -v to see invocation)
error: command 'g++' failed with exit status 1
Here is a similar problem: https://github.com/pandas-dev/pandas/issues/23424 这是一个类似的问题: https : //github.com/pandas-dev/pandas/issues/23424
As they suggest, and as indicated by the line in the output 正如他们所建议的那样,并且如输出中的线所示
clang: warning: libstdc++ is deprecated; move to libc++ with a minimum deployment target of OS X 10.9 [-Wdeprecated]
adding extra_link_args=["-stdlib=libc++", "-mmacosx-version-min=10.9"]
solves the problem. 添加
extra_link_args=["-stdlib=libc++", "-mmacosx-version-min=10.9"]
解决了这个问题。 setup.py
then looks like this: setup.py
然后看起来像这样:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [Extension("test",
sources=["test.pyx", "my_sum.cpp"],
language="c++",
extra_link_args=["-stdlib=libc++", "-mmacosx-version-min=10.9"])]
setup(cmdclass = {'build_ext': build_ext}, ext_modules = ext_modules)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.