我有用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访问应用程序内存中的其他应用程序静态函数。
我很欣赏正确方向的任何一点。
答案 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中使用它一样,除了在所有三个平台上的这项工作
干杯!