从 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 除了这在所有三个平台上都有效。
干杯!
我有一个用 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 除了这在所有三个平台上都有效。
干杯!