我想用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)
Run Code Online (Sandbox Code Playgroud)
该-fopenmp标志与gcc一起用于编译和链接OpenMP.但是,如果我只是调用
cls ~/workspace/CythonOpenMP/src $ python3 setup.py build
Run Code Online (Sandbox Code Playgroud)
这个标志无法识别,因为编译器是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 …Run Code Online (Sandbox Code Playgroud) 当我在用 cython 编译的模块中使用任何import 语句时,我在导入模块时收到以下错误(请参阅下面的完整代码):
ImportError: /.../hw.cpython-35m-x86_64-linux-gnu.so: undefined symbol: __intel_sse2_strchr
Run Code Online (Sandbox Code Playgroud)
在我自己的机器上一切正常,但是当我尝试在外部高性能计算机上重新编译和运行我的脚本时出现此错误。
谷歌搜索我看到在几个地方弹出了类似的错误,但在这些讨论中,问题要么与自己的代码中的错误有关,而不是与导入的模块有关(例如,未定义符号错误导入 Cython 模块)或在构建 cython 或编译时间(例如cython 可以用 icc 编译吗?)。我不知道如何将这些应用于我的案例。
通过阅读其他讨论,我怀疑问题setup.py出在我的 . 我尝试将 numpy 添加到设置中(见setup2.py下文),但这并没有解决问题 - 我在import hw.
完整示例
硬件.pyx:
import numpy # without this line, the example works fine
cpdef testfun():
print("Hello world!")
Run Code Online (Sandbox Code Playgroud)
设置.py:
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules = cythonize('hw.pyx'),
)
Run Code Online (Sandbox Code Playgroud)
设置2.py:
from distutils.core import setup
from Cython.Build import cythonize
import numpy as …Run Code Online (Sandbox Code Playgroud) 我能够从源代码在Ubuntu 14.04上成功构建cython,如本SE问题所述/回答编译cython来自icc的源代码,我从这里下载了源代码 - Cython源代码下载.
编译cython的命令是
CC = icc LINKCC = icc python3.4 setup.py build
我附上了构建日志.它仍然使用gcc进行链接.以下是构建日志的示例.
看来CC = icc LINKCC = icc似乎没有将链接器更改为icc.它仍在使用x86_64-linux-gnu-gcc.当我设置环境变量LDFLAGS = -lirc时,环境变量被传递给gcc而不是icc.此外,当我在BuildExecutable.py中放置print语句时,它们不会被调用.
icc -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -g -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.4m -c /home/aswin/libPython/Cython-0.24/Cython/Plex/Scanners.c -o build/temp.linux-x86_64-3.4/home/aswin/libPython/Cython-0.24/Cython/Plex/Scanners.o
icc: command line warning #10006: ignoring unknown option '-fwrapv'
creating build/lib.linux-x86_64-3.4
creating build/lib.linux-x86_64-3.4/Cython
creating build/lib.linux-x86_64-3.4/Cython/Plex
x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -lirc -g -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 …Run Code Online (Sandbox Code Playgroud)