Сразу к делу. Имеем код на C++:
#include <iostream> class Sq { public: Sq() { std::cout << "Constructed" << std::endl; } void out() { for(int i=0; i<10; i++) std::cout << i*i << std::endl; } }; extern "C" { Sq * Sq_new() { return new Sq(); } void Sq_out(Sq * sq) { sq->out(); } }
Код скомпилирован в статическую библиотеку libtest.so командами:
g++ -c -fPIC test.cpp -o test.o
g++ -shared -o libtest.so test.o
Ошибок нет. Всё хорошо.
также имеем файл pycpp.py:
from ctypes import cdll lib = cdll.LoadLibrary('libtest.so') print lib print lib.Sq_new print lib.Sq_out class Sq(object): def __init__(self): self.obj = lib.Sq_new() def out(self): lib.Sq_out(self.obj) sq = Sq() sq.out()
При запуске получаем:
pydev debugger: starting (pid: 6668)
<CDLL ‘libtest.so’, handle 60850000 at 23f1cc0>
<_FuncPtr object at 0x00000000027A8048>
<_FuncPtr object at 0x00000000027A8118>
Traceback (most recent call last):
File “C:\Program Files\Brainwy\LiClipse 0.9.8\plugins\org.python.pydev_3.4.1.201403181446\pysrc\pydevd.py”, line 1844, in <module>
debugger.run(setup, None, None)
File “C:\Program Files\Brainwy\LiClipse 0.9.8\plugins\org.python.pydev_3.4.1.201403181446\pysrc\pydevd.py”, line 1372, in run
pydev_imports.execfile(file, globals, locals) # execute the script
File “E:\Sources\LiClipseWorkspace\Python_C++_integration\pycpp\pycpp.py”, line 15, in <module>
sq = Sq()
File “E:\Sources\LiClipseWorkspace\Python_C++_integration\pycpp\pycpp.py”, line 10, in __init__
self.obj = lib.Sq_new()
WindowsError: exception: access violation writing 0x0000000000009000
С чем такое поведение может быть связано? Что я делаю не так?
Спасибо.