我有相当大的C ++库,有几个支持它的子库,我需要把整个东西变成python扩展。我正在使用distutils,因为它需要跨平台,但如果有更好的工具我会接受建议。
有没有办法让distutils首先编译子库,并在从主库创建扩展时链接它们?
答案 0 :(得分:10)
我在我们的产品中使用了一个庞大的C ++库。有几种工具可以帮助您自动完成编写绑定的任务:最受欢迎的是SWIG,它已经存在了很长一段时间,用于很多项目,并且通常运行良好。
对SWIG最重要的事情(在我看来)是SWIG本身的C ++代码库本身相当苛刻。它是在STL之前编写的,并且拥有自己的半动态类型系统,现在只是陈旧而吱吱作响。除非你不得不陷入困境并对核心进行一些修改(我曾尝试添加doxygen - > docstring转换),否则这并不重要,但如果你做过,祝你好运!人们还说SWIG生成的代码不是那么有效,这可能是真的,但对我来说,我从来没有发现SWIG认为自己足以成为瓶颈而无法担心它。
如果SWIG没有漂浮您的船,您可以使用其他工具:boost.python也很受欢迎,如果您已经在C ++代码中使用了boost库,那么它可能是一个不错的选择。缺点是它在编译时间很重,因为它几乎都是基于c ++模板的。
这两个工具都要求您预先做一些工作,以便定义将要公开的内容以及如何完成。对于SWIG,您提供的接口文件类似于C ++标头但是被剥离,并且有一些额外的指令告诉SWIG如何翻译复杂类型等。编写这些接口可能很乏味,因此您可能希望查看类似{{3}的内容}帮助您自动生成它们。
该软件包的作者实际上编写了另一个您可能喜欢的扩展名:pygccxml。这个包做了两件事:它可以自动生成绑定定义,然后可以将其提供给boost.python以生成python绑定:基本上它是大多数人的完整解决方案。如果您没有特别或困难的要求,您可能想要从那里开始。
其他一些可能有用的参考问题:
您也可以找到适合Python的Extending Python with C/C++绑定生成工具。正如亚历克斯在评论中指出的那样,它现在相当古老,但至少可以让你对景观有所了解......
就如何驱动构建而言,您可能希望查看更高级的内置工具,如果您想坚持使用Python,我强烈建议this comparison作为框架(其他人会告诉您Waf是要走的路,但相信我,它已经很慢了:我已经去过那里了!)......需要一点点学习,但当你了解它时,它是非常强大的。而且由于它是纯Python,它将与构建过程中的任何其他Python代码完美集成(例如,最后使用Py ++)...