从dll访问类的静态成员 我有C++编写的应用程序,使用SWIG进行Python集成。

从dll访问类的静态成员 我有C++编写的应用程序,使用SWIG进行Python集成。,c++,dll,shared-libraries,swig,shared-objects,C++,Dll,Shared Libraries,Swig,Shared Objects,现在,在linux/osx下,当我构建swig包装器时,它会创建一个这样的文件,从这样的应用程序中使用 Py_Initialize(); PyRun_SimpleString("import MoBridge"); PyRun_SimpleString("a = MoBridge.MoBridge()"); PyRun_SimpleString("a.CreateQuadMesh()"); Py_Finalize(); PyImport_AppendInittab("_MoBridge", P

现在,在linux/osx下,当我构建swig包装器时,它会创建一个这样的文件,从这样的应用程序中使用

Py_Initialize();
PyRun_SimpleString("import MoBridge");
PyRun_SimpleString("a = MoBridge.MoBridge()");
PyRun_SimpleString("a.CreateQuadMesh()");
Py_Finalize();
PyImport_AppendInittab("_MoBridge", PyInit__MoBridge);
<>这是导入包装器莫布里奇,然后调用包装器C++函数CreateQuadMesh。包装器大致如下所示

h文件:

#include "MoEngine.h"

class MoBridge
{
public:
    MoBridge();
    ~MoBridge();
    void CreateQuadMesh();
};
cpp文件:

#include "mobridge.h"

void MoBridge::CreateQuadMesh()
{
    MoEngine::CreateMesh();
}
包装器调用MoEngine静态函数,然后执行它所执行的操作

如果我理解正确的话,这在Linux/osx下非常有效,因为so文件的链接方式

但在windows下,我必须创建DLL,而且据我所知,DLL文件的加载方式不同,因此它们与应用程序的其余部分位于不同的内存中,因此无法看到其他静态方法的应用程序

我知道我可以使用dllexport将dll中的方法公开给应用程序的其余部分。但在本例中,我将介绍如何允许dll访问应用程序内存中的其余应用程序静态函数


如果有人遇到这个问题,我会非常感激。如果有人在linux、osx和windows中遇到这个问题,我已经找到了解决方案

使用共享对象*.so当然可以在linux/osx上使用,但幸运的是,SWIG中有一个更容易使用的解决方案,它实际上没有在SWIG中记录,但在python文档中记录了。谢谢python

为了实现这一点,您不需要从包装器中创建dll或其他文件,但在swig创建*\u wrap.cxx文件后,您应该将其包含在项目中,在调用Py\u Initialize之前,您可以像这样导入模块

Py_Initialize();
PyRun_SimpleString("import MoBridge");
PyRun_SimpleString("a = MoBridge.MoBridge()");
PyRun_SimpleString("a.CreateQuadMesh()");
Py_Finalize();
PyImport_AppendInittab("_MoBridge", PyInit__MoBridge);
然后,您可以使用前面提到的:

Py_Initialize();
PyRun_SimpleString("import MoBridge");
PyRun_SimpleString("a = MoBridge.MoBridge()");
PyRun_SimpleString("a.CreateQuadMesh()");
Py_Finalize();
基本上,因为您的项目中有*_wrap.cxx,而python基本上就存在于您的应用程序中,因为您初始化了它,所以您的行为与在linux/osx中使用的行为完全相同,除了这三种平台上的工作

干杯