Cython:避免在每个扩展名上编译所有C / C ++文件。目标:在PyPi中分发

时间:2018-08-01 13:53:13

标签: python c++ cython python-extensions

我目前正在从事的Cython项目包括大约20个C ++文件,这些文件充当C ++实现。在顶部,我构建了三个用Cython编写的扩展模块,每个模块都捕获了C ++实现的不同但相互关联的功能。为了包装C ++所需的功能,我使用了一个定义所有.pxd块的单个cdef extern文件。稍后,带有3个扩展模块的3个.pyx文件(每个.pyx文件一个扩展模块)将导入pxd包装程序并添加其他功能。

现在,我的目标是打包整个库并使用PyPi分发。使用setup.py时出现我的问题:我不知道如何使C ++代码可用于所有扩展模块。为了进行开发,我已经在Linux中将C ++安装为动态库,这显然存在很多可移植性问题。我非常愿意将C ++源代码导出到本地进行编译(因此使用python setup.py sdist创建源分发)。

这些是我到目前为止采取的方法,但都失败了:

  1. 在所有扩展名的sources中包括C ++源文件。它为每个扩展编译所有C ++文件。这将创建全局对象的多个副本。
  2. 在最重要的扩展中包括C ++源文件,并始终首先将其导入。其他扩展模块会抛出undefined symbol错误,因为它们无权访问C ++实现。
  3. 使用Cython .pxd包装器的名称创建第四个扩展模块,然后首先将其导入。与上述结果(#2)相同。

任何提示将不胜感激!

0 个答案:

没有答案