2015-03-26 3 views
0

У меня есть приложение, написанное на C++, которое использует SWIG для интеграции с python.Доступ к статическим членам класса из dll

Теперь под linux/osx, когда я создаю swig wrapper, он создает такой файл, который используется из приложения, подобного этому.

Py_Initialize(); 
PyRun_SimpleString("import MoBridge"); 
PyRun_SimpleString("a = MoBridge.MoBridge()"); 
PyRun_SimpleString("a.CreateQuadMesh()"); 
Py_Finalize(); 

Что это делает она импортирует обертку Mobridge, то он вызывает прогиб обертку C++ функции CreateQuadMesh(). Обертка примерно выглядит примерно так

ч файла:

#include "MoEngine.h" 

class MoBridge 
{ 
public: 
    MoBridge(); 
    ~MoBridge(); 
    void CreateQuadMesh(); 
}; 

CPP файл:

#include "mobridge.h" 

void MoBridge::CreateQuadMesh() 
{ 
    MoEngine::CreateMesh(); 
} 

Обертка вызывает MoEngine статической функции, и это в свою очередь делает то, что он делает.

Теперь это отлично работает под Linux/osx, если я правильно понял его, потому что так связан файл.

Но под окнами мне приходилось создавать DLL, и, насколько я понял, файлы DLL загружаются по-разному, поэтому они живут в другой памяти от остальной части приложения и, следовательно, не могут видеть приложения другими статическими методами.

Я знаю, что я могу использовать dllexport для поиска методов из dll для остальной части приложения. Но в этом случае я смотрю, как разрешить DLL доступ к остальным приложениям статических функций в памяти приложений.

Буду признателен за любую точку в правильном направлении.

+0

http://stackoverflow.com/questions/8654327/use-static-class-variable-function-across-dlls http://stackoverflow.com/questions/4911994/sharing-a-global-static-variable -between-a-process-and-dll Я думаю, что они рассматривают ваш вопрос. Дайте ему прочитать – Mercious

ответ

0

Если кто-то застрял с этим, я нашел решение, которое разрешит это как в Linux, так и в ОС.

используя общий объект * .so, конечно, работы с Linux/OSX, но, к счастью, есть еще проще решение использовать с SWIG, что на самом деле не документированной в SWIG, но это документально в питона документации (спасибо 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 в проекте и питона, по существу, живет в вашем приложении, так как вы инициализирован его у вас есть точно такое же поведение, как если бы вы использовали это в linux/osx, за исключением этой работы на всех трех платформах.

Cheers!

 Смежные вопросы

  • Нет связанных вопросов^_^