从dll访问类的静态成员

时间:2015-03-26 08:15:42

标签: c++ dll shared-libraries swig shared-objects

我有用C ++编写的应用程序,它使用SWIG进行python集成。

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

Py_Initialize();
PyRun_SimpleString("import MoBridge");
PyRun_SimpleString("a = MoBridge.MoBridge()");
PyRun_SimpleString("a.CreateQuadMesh()");
Py_Finalize();

它的作用是导入包装器MoBridge,然后调用包装器C ++函数CreateQuadMesh()。 Wrapper大致看起来大致像这样

h file:

#include "MoEngine.h"

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

cpp文件:

#include "mobridge.h"

void MoBridge::CreateQuadMesh()
{
    MoEngine::CreateMesh();
}

包装器调用MoEngine静态函数,它依次执行它的工作。

现在这在Linux / osx下运行得很好,如果我理解正确的话,因为文件链接的方式。

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

我知道我可以使用dllexport将方法从dll暴露给应用程序的其余部分。但在这种情况下,我正在研究如何允许dll访问应用程序内存中的其他应用程序静态函数。

我很欣赏正确方向的任何一点。

1 个答案:

答案 0 :(得分:0)

如果有人对此感到困惑,我找到了解决方案,可以在linux,osx和windows中解决这个问题。

使用共享对象* .so当然可以使用linux / osx但幸运的是有更简单的解决方案可以与SWIG一起使用,这在SWIG中没有记录,但是在python文档中有记录(谢谢python!)

为了实现这一点,您不需要从包装器创建dll左右文件,但是在swig创建了* _wrap.cxx文件后,您应该将它包含在项目中,并在调用Py_Initialize()之前导入模块,就像这样

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中使用它一样,除了在所有三个平台上的这项工作

干杯!