从 dll 访问 class 的静态成员

Accessing static members of a class from dll

我有一个用 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 文件:

#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 或 so 文件,但在 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 除了这在所有三个平台上都有效。

干杯!