我想用Cython包装一个包含C ++和OpenMP代码的测试项目,并通过setup.py
文件使用distutils构建它。我的文件内容如下所示:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
from Cython.Distutils import build_ext
modules = [Extension("Interface",
["Interface.pyx", "Parallel.cpp"],
language = "c++",
extra_compile_args=["-fopenmp"],
extra_link_args=["-fopenmp"])]
for e in modules:
e.cython_directives = {"embedsignature" : True}
setup(name="Interface",
cmdclass={"build_ext": build_ext},
ext_modules=modules)
-fopenmp
标志与gcc一起用于编译和链接OpenMP。但是,如果我只是调用
cls ~/workspace/CythonOpenMP/src $ python3 setup.py build
无法识别此标志,因为编译器是clang:
running build
running build_ext
skipping 'Interface.cpp' Cython extension (up-to-date)
building 'Interface' extension
cc -Wno-unused-result -fno-common -dynamic -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -I/usr/local/include -I/usr/local/opt/sqlite/include -I/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/include/python3.3m -c Interface.cpp -o build/temp.macosx-10.8-x86_64-3.3/Interface.o -fopenmp
clang: warning: argument unused during compilation: '-fopenmp'
cc -Wno-unused-result -fno-common -dynamic -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -I/usr/local/include -I/usr/local/opt/sqlite/include -I/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/include/python3.3m -c Parallel.cpp -o build/temp.macosx-10.8-x86_64-3.3/Parallel.o -fopenmp
clang: warning: argument unused during compilation: '-fopenmp'
Parallel.cpp:24:10: warning: unknown pragma ignored [-Wunknown-pragmas]
#pragma omp parallel for
^
1 warning generated.
c++ -bundle -undefined dynamic_lookup -L/usr/local/lib -L/usr/local/opt/sqlite/lib build/temp.macosx-10.8-x86_64-3.3/Interface.o build/temp.macosx-10.8-x86_64-3.3/Parallel.o -o build/lib.macosx-10.8-x86_64-3.3/Interface.so -fopenmp
ld: library not found for -lgomp
clang: error: linker command failed with exit code 1 (use -v to see invocation)
error: command 'c++' failed with exit status 1
我没有尝试过指定gcc:
cls ~/workspace/CythonOpenMP/src $ python3 setup.py build --compiler=g++-4.7
running build
running build_ext
error: don't know how to compile C/C++ code on platform 'posix' with 'g++-4.7' compiler
如何判断distutils使用gcc?
答案 0 :(得分:47)
尝试使用os.environ从setup.py中设置“CC”环境变量。
答案 1 :(得分:19)
以防万一其他人在Windows下遇到同样的问题(CC环境变量没有任何影响):
代码:
[build]
compiler = mingw32
这:
self.set_executables(compiler='gcc -mno-cygwin -O -Wall',
compiler_so='gcc -mno-cygwin -mdll -O -Wall',
compiler_cxx='g++ -mno-cygwin -O -Wall',
linker_exe='gcc -mno-cygwin',
linker_so='%s -mno-cygwin %s %s'
% (self.linker_dll, shared_option,
entry_point))
成为这个:
self.set_executables(compiler='gcc -O -Wall',
compiler_so='gcc -mdll -O -Wall',
compiler_cxx='g++ -O -Wall',
linker_exe='gcc',
linker_so='%s %s %s'
% (self.linker_dll, shared_option,
entry_point))
如果您使用的是最新版本的gcc,那么第二点可能是必要的,其中已弃用的选项-mno-cygwin
已被删除。
希望这会有所帮助,即使它与OP的实际需求没有直接关系(但仍然与问题的标题有关......)
答案 2 :(得分:16)
我刚刚查看了distutils
来源,--compiler
选项需要“unix”,“msvc”,“cygwin”,“mingw32”,“bcpp”或“emx” 。它通过检查CC
环境变量来检查所需的编译器名称。尝试像这样调用build:
CC=gcc python setup.py build
您无需设置CXX
,也不会检查该内容。
答案 3 :(得分:0)
根据this wiki,3.4之后的Python版本不再支持MinGW。
适用于Windows的CPython 3.7使用MSC v.1916
进行编译。当我尝试将上述方法与distutils.cfg
一起使用时,我从distutils中得到了一个错误:Unknown MS Compiler Version 1916
。看起来它的cygwincompiler.py
文件(还负责MinGW)中具有msvcr库的硬编码表,该文件已知的最新版本是VS2010 / MSVC 10.0中的1600
。
答案 4 :(得分:-1)
试试这个: http://mail.python.org/pipermail/distutils-sig/2002-August/002944.html
简而言之,您似乎应该尝试:python setup.py build --compiler = g ++ first。