我有一个Python GUI应用程序,它需要合并一个有点复杂的C++ dll。我已经研究了boost.python,但遇到了困难,因为该程序包含5个单独的C++文件,而且我以前没有C++编码经验。我能够得到一个使用Python语言的测试'Hello World‘C++动态链接库,但是与我需要的动态链接库相比,C++代码要简单得多。
我已经让dll与Visual Basic项目一起工作,但我正在寻找Python中相同应用程序的最佳可能解决方案。
最好是尝试用Python语言完全重写C++代码,还是尝试正确地编写boost.python包装器?如果用python重写代码所需的时间与编写包装器代码所需的时间相当,那么完全重写代码会更好吗?
将dll代码从编译语言转换为解释语言会带来更多负面影响而不是正面影响吗?
先谢谢你,
加勒特
发布于 2013-09-04 13:54:27
大约一年前,我作为一名新手/中级C++程序员开始使用boost.python,我对继续使用它的决定感到非常高兴。学习的曲线是陡峭的,但一旦你学会了如何浏览在线文档,它就会逐渐变得平缓。我时不时会遇到麻烦,但我找到的关于如何正确使用boost.python的最好的帮助,就像之前在SO和独立博客上提出的问题一样。在以太中有大量的在线文档。
最好是尝试用Python语言完全重写C++代码,还是尝试正确编写boost.python包装器?
这取决于:
1) C++动态链接库做了多少“繁重的工作”。
2)将哪种类型的参数从C++传递到Python。
3)您需要多久才能交付代码的工作版本。
如果要创建C++对象的实例,从python中调用其成员,并返回numpy数组,这是相对简单的操作。如果你需要在C++中对PyObjects进行操作,那么很快就会变得有点棘手。如果你需要做后者,准备好投入更多的时间和精力。
此外,请记住,当您创建dll时,二进制文件将与相同主要版本中的微型版本兼容。过去,我在一台安装了Python2.7的机器上运行*.so时遇到了可移植性问题,当时它与Python2.6库链接在一起。请参见:
发布于 2013-09-05 03:07:14
根据我的经验,最简单的方法是ctype:http://docs.python.org/2/library/ctypes.html
只要你能用几个C函数来表达你的接口,这就行了。对于大多数C++库来说,这很简单,只要您不需要子类化就可以使用它。
优势:
我该怎么做呢?Ctypes是我研究的第一件事,但我从不同的地方得到的印象是,它在C++动态链接库中不能正常工作。
您可以将函数声明为extern "C"。这是最简单的部分,您可以在任何好的C++书籍中找到详细信息。困难的部分是以一种不需要C++特性的方式设计接口,比如模板或继承。“抽象数据类型”(ADT)是这类东西的一个很好的设计原则。查一查。要获得更详细的帮助,如果你可以发布你的C++库的接口,或者它的一部分,我们可以用一个例子来解释。
另一个问题是C++运行时。它必须以某种方式链接到您的DLL。如果您使用linux,我建议您使用libtool。我不知道Windows的事。也许它只是起作用了。如果没有,请将错误消息放入您喜欢的搜索机器中。
https://stackoverflow.com/questions/18602191
复制相似问题