使用Cython包装依赖于多个库的C/C++程序



我有一个大型C/C++项目,我通常只是将其构建为一个独立的可执行文件。它还需要一些库(像pthread这样的系统库,但也需要英特尔的MKL(,我在编译项目时指定这些库。

现在,我想在Python中使用这个项目中的一些函数。所以我的第一个计划是简单地将项目构建为一个静态库,然后用它来编写一个cython包装器。即

  1. 构建c项目:icc -c src/main.cpp .. options and stuff.. linking to all libraries needed .. -o main.o

  2. 创建一个静态库(包括我在步骤1中需要的库(:ar -rc libmain.a main.o ${MKLROOT}/lib/intel64/libmkl_intel_lp64.a ... /usr/lib/x86_64-linux-gnu/libpthread.a ...

  3. 我使用生成的静态库来构建我的cython包装

  4. 当我试图执行一个测试python脚本,从我的C程序中调用一个随机函数时,我得到了这个错误ImportError: /home/.../main.cpython-37m-x86_64-linux-gnu.so: undefined symbol: __kmpc_ok_to_fork

我似乎需要告诉cython再次链接到相应的库或其他什么,但我真的不确定如何解决这个问题。。此外,我不希望python项目依赖于我在系统上安装的一些特殊库(这就是我在步骤2中添加所有库所试图实现的(,这可能吗?

我的setup.py看起来像这个

from setuptools import setup, Extension
from Cython.Build import cythonize
import os
os.environ["CC"] = "icc"
os.environ["CXX"] = "icc"
setup(
ext_modules = cythonize([Extension("test", ["test.pyx"], language="c++",
library_dirs=[r'.'], libraries=['main'])])
)

创建一个共享库(linux上的.so(。Python只能支持动态库或共享库。链接器正在查找.so而不是.a

所以你的setup.py会保持不变,

from setuptools import setup, Extension
from Cython.Build import cythonize
import os
os.environ["CC"] = "icc"
os.environ["CXX"] = "icc"
setup(
ext_modules = cythonize([Extension("test", ["test.pyx"], language="c++",
library_dirs=[r'.'], libraries=['main'])])
)

相关-使用Cython将Python链接到共享库。

最新更新