Форум сайта python.su
Добрый вечер.
Сразу к делу. Имеем код на 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(); } }
g++ -c -fPIC test.cpp -o test.o
g++ -shared -o libtest.so test.o
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
Отредактировано lnkr-a (Апрель 14, 2014 21:45:23)
Офлайн
Ваш код у меня дает
<CDLL 'libtest.so', handle 61b40000 at b5ee90> <_FuncPtr object at 0x00ACF828> <_FuncPtr object at 0x00ACF8A0> Constructed 0 1 4 9 16 25 36 49 64 81
Отредактировано doza_and (Апрель 14, 2014 22:03:51)
Офлайн
Нет. То же самое. Скажите пожалуйста, с какими версиями python и g++ Вы это запустили. И в какой системе? У меня Win 8 64bit, python 2.7 (64bit), g++ (GCC) 4.8.2 “Target x86_64-pc-cygwin”
Отредактировано lnkr-a (Апрель 14, 2014 22:09:48)
Офлайн
gcc.exe (GCC) 4.8.1
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
python 2.7 все 32 разряда потому что windows XP mingw
порядок меняется при перенаправлении в файл. Походу проблемы с инициализацией iostream.
запускаете с консоли cygwin? может runtime не находит?
попробуйте depends libtest.so
Отредактировано doza_and (Апрель 14, 2014 22:16:37)
Офлайн
Спасибо.
Вы знаете, из консоли cyqwin по команде python E……/pycpp.py всё работает, если в pycpp.py указать абсолютный путь к libtest.so
Всё же хотелось бы знать, как сделать так, чтобы запускалось из обычной консоли и работало с относительными путями. Может компилятор другой для библиотеки использовать? Чтобы от cygwin не зависеть.
Офлайн
lnkr-aобычное дело . В nix текущая директория не входит в path. Поправьте скрипт инициализации cygwin.
если в pycpp.py указать абсолютный путь
lnkr-aпросто прописать в системе path в cygwin/bin
чтобы запускалось из обычной консоли
Офлайн
link-rЭто я не понял.
Может компилятор другой для библиотеки использовать?
Отредактировано doza_and (Апрель 14, 2014 23:11:51)
Офлайн
doza_and
просто прописать в системе path в cygwin/bin
Офлайн
lnkr-aэто не статическая библиотека, а динамическая
Код скомпилирован в статическую библиотеку libtest.so командами:
lnkr-aпри компиляции может и не быть ошибок, надо запуск проверить
Ошибок нет. Всё хорошо.
Офлайн
lnkr-aПитонов может стоять хоть 10. Какая разница между ними? Да может быть какая угодно. Вы можете понаставить туда модулей в произвольных комбинациях, скомилировать питоны с разными ключами и т.п. Если у вас нет насущной необходимости держать несколько питонов, то лишние удалите, или попрячьте.
В чём вообще разница между
lnkr-aОткуда хотите запустить?
Хотелось бы запускать скрипты именно оттуда.
Офлайн