从 dll 访问类的静态成员
Posted
技术标签:
【中文标题】从 dll 访问类的静态成员【英文标题】:Accessing static members of a class from dll 【发布时间】:2015-03-26 08:15:42 【问题描述】:我有一个用 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 访问应用程序内存中的其余应用程序静态函数。
我将不胜感激任何正确方向的观点。
【问题讨论】:
***.com/questions/8654327/… ***.com/questions/4911994/… 我认为这些考虑了您的问题。读一读 【参考方案1】:如果有人遇到这个问题,我已经找到了可以在 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 中使用它一样,除了这在所有三个平台上都有效.
干杯!
【讨论】:
以上是关于从 dll 访问类的静态成员的主要内容,如果未能解决你的问题,请参考以下文章