在Python中使用C ++ DLL

时间:2016-04-06 14:31:45

标签: python c++ dll swig boost-python

对不起,如果这个问题在这里重复多次,但我花了一整天没有找到明确的答案。

我在Visual Studio 2010下工作,并且我试图将DLL中定义的类加载到Python中。我看到没有制作C ++包装器(最终使用SWIG或Boost.Python)就无法做到这一点。我不是C ++程序员,我无法找到一个简单明了的教程,如果你能给我一个简单的教程,我将不胜感激。

此外,我的类使用单例模式将其实例化限制为一个对象,如下所示:

MyClass*    MyClass::getInstance()
{
    if(instance==NULL)                  
        instance    =   new MyClass();      

    return instance;
}

所以我需要知道如何在我的Python脚本中处理这个问题,这样我就可以创建一个MyClass实例并访问它的所有方法。

谢谢你们。

1 个答案:

答案 0 :(得分:0)

在找到解决问题的方法后,我回过头来回答我的问题。

我使用SWIG制作C ++包装器。所以我定义了模块接口:

%module MyClass
    %{
    #include    "MyClass.h"
    %}
    %include <windows.i>   //if you're using __declspec(dllexport) to export dll
    %include "MyClass.h"

然后用:

直接编译
    >swig -c++ -python MyClass.i

这会生成两个文件: MyClass.py MyClass_wrap.cxx

然后我将MyClass_wrap.cxx文件包含在Visual Studio中的项目中,并对我的项目属性进行了这些更改:

配置属性&gt;一般&gt;目标名称: _MyClass 目标扩展: .pyd

C / C ++&gt;一般&gt;其他包含目录: / path / to / Python / include

链接器&gt;其他库目录: // path / to / Python / libs

然后编译项目以生成 _MyClass.pyd

在我的Python脚本中,它简单如下:

import MyClass
instance = MyClass.MyClass.getInstance()
#and then use all MyClass methods via instance, ex: instance.SomeMethod()

这就是全部。 SWIG完成了处理getInstance()返回的引用的所有工作。