Найти - Пользователи
Полная версия: Статическая C++ библиотека. Вызов из Python. access violation writing 0x0000000000009000
Начало » Python для экспертов » Статическая C++ библиотека. Вызов из Python. access violation writing 0x0000000000009000
1
lnkr-a
Добрый вечер.

Сразу к делу. Имеем код на 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

С чем такое поведение может быть связано? Что я делаю не так?
Спасибо.
doza_and
Ваш код у меня дает
<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
Запустите с консоли может Pydev пакостит. Питон у вас какой? разрядность so файла должна совпадать с разрядностью используемого питона. Походу so у вас под 64 разряда.
lnkr-a
Нет. То же самое. Скажите пожалуйста, с какими версиями python и g++ Вы это запустили. И в какой системе? У меня Win 8 64bit, python 2.7 (64bit), g++ (GCC) 4.8.2 “Target x86_64-pc-cygwin”
doza_and
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
lnkr-a
Спасибо.
Вы знаете, из консоли cyqwin по команде python E……/pycpp.py всё работает, если в pycpp.py указать абсолютный путь к libtest.so

Всё же хотелось бы знать, как сделать так, чтобы запускалось из обычной консоли и работало с относительными путями. Может компилятор другой для библиотеки использовать? Чтобы от cygwin не зависеть.
doza_and
lnkr-a
если в pycpp.py указать абсолютный путь
обычное дело . В nix текущая директория не входит в path. Поправьте скрипт инициализации cygwin.
lnkr-a
чтобы запускалось из обычной консоли
просто прописать в системе path в cygwin/bin
doza_and
link-r
Может компилятор другой для библиотеки использовать?
Это я не понял.
lnkr-a
doza_and
просто прописать в системе path в cygwin/bin

Я что-то не совсем это всё понимаю. У меня есть CPython27/ и СPython27_32bit/ , которые я установил без какого-либо cygwin. В PATH пути прописаны для 64хбитного (32-х битный использовал лишь когда писал авторассылку для скайпа, ибо Skype4Py для 64бит так и не выпустили) Хотелось бы запускать скрипты именно оттуда.

В чём вообще разница между Ccygwin64/python2.7.exe и СPython27/python.exe
Что-то я вообще сути не улавливаю.
py.user.next
lnkr-a
Код скомпилирован в статическую библиотеку libtest.so командами:
это не статическая библиотека, а динамическая
у статической расширение .a
.a - archive
.so - shared object

lnkr-a
Ошибок нет. Всё хорошо.
при компиляции может и не быть ошибок, надо запуск проверить
сделать программу на C++ и там проверить
doza_and
lnkr-a
В чём вообще разница между
Питонов может стоять хоть 10. Какая разница между ними? Да может быть какая угодно. Вы можете понаставить туда модулей в произвольных комбинациях, скомилировать питоны с разными ключами и т.п. Если у вас нет насущной необходимости держать несколько питонов, то лишние удалите, или попрячьте.
Если она есть, то вам надо изучить virtualenv.

Я могу ошибаться но думаю проблема не в питонах. Для загрузки динамической библиотеки могут быть нужны еще динамические библиотеки рантайма. Они должны быть или рядом с исполняемым модулем (python.exe) или в путях поиска исполняемых файлов. Ну может еще как можно их разместить. Например полученная у меня вашей командой библиотека зависит от LIBSTDC++-6.DLL, LIBGCC_S_DW2-1.DLL. Но у меня mingw в путях есть. Посмотрите утилитами depends,dumpbin или аналогичными.
lnkr-a
Хотелось бы запускать скрипты именно оттуда.
Откуда хотите запустить?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB