从 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 访问类的静态成员的主要内容,如果未能解决你的问题,请参考以下文章

C++ - 如何从同一个类的静态函数访问一个类的私有成员?

java中的静态static关键字

C# 我定义了一个静态类编译成DLL后,在另一个项目中引用这个DLL,但访问不了里面的成员

从嵌套类的函数访问父级的非静态成员

DLL导出类静态成员函数问题

类静态方法访问它的静态数据成员