Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 11, 2009 21:42:48

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Boost,ImportError: dynamic module does not define init function (initN

Я хочу сделать обертку для класса на С++ с помощью Boost. Использую Py++, как генератор кода. Все проходит хорошо, питоний модуль создается, но при его импорте вылезает ошибка: ImportError: dynamic module does not define init function (initNpc).
Вот класс на С++:

#ifndef NPC_H_
#define NPC_H_

class WorldObject{}; // абстрактный игровой объект

class Npc : public WorldObject
{
public:
Npc();
void setId(int id);
int getId();

private:
int id;
};

#endif /* NPC_H_ */
вот сгенерированный Py++ код:
#include "boost/python.hpp"

#include "Npc.h"

namespace bp = boost::python;

BOOST_PYTHON_MODULE(Npc){
bp::class_< WorldObject >( "WorldObject" );

bp::class_< Npc, bp::bases< WorldObject > >( "Npc", bp::init< >() )
.def(
"getId"
, (int ( ::Npc::* )( ) )( &::Npc::getId ) )
.def(
"setId"
, (void ( ::Npc::* )( int ) )( &::Npc::setId )
, ( bp::arg("id") ) );
}
потом с помощью bjam собираю модуль.

Гуглил эту ошибку, но все решения сводятся к тому, что имя модуля не совпадало в паре мест. У меня везде все совпадает: и в сгенерированном коде и в jamroot файле и имя файла Npc.so такое же, но все равно та же ошибка. Такое ощущение, что я не вижу какой-то глупой опечатки. Покажите, пожалуйста, в чем ошибка?



Офлайн

#2 Ноя. 13, 2009 14:05:24

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Boost,ImportError: dynamic module does not define init function (initN

Неужели, никто не работал с boost? Может тогда подскажете еще простой способ сделать обертку для с++ библиотеки или как вручную добавить init функцию?



Офлайн

#3 Ноя. 13, 2009 15:05:33

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Boost,ImportError: dynamic module does not define init function (initN

Отчего же, работал. Но у тебя все правильно описано.
Остается только убедиться, что имя модуля Npc.so (linux?) и в нем есть имя _initNpc - и все должно быть нормально.
По крайней мере то, что я вижу - корректное.



Офлайн

#4 Ноя. 13, 2009 18:57:41

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Boost,ImportError: dynamic module does not define init function (initN

Имя модуля правильное. А как посмотреть наличие в нем этого имени? `objdump -d Npc.so` находит только просто _init.
Его можно вручную дописать? Вроде как initNpc должен был создаться где-то в BOOST_PYTHON_MODULE(Npc), и как сделать его самому не сказано.

п.с. вот содержимое jamroot файла

using gcc ;
using python ;
python-extension Npc :
Npc.h
Npc.cpp
Npc_wrapper.h # это сгенерированный Py++ файл
;
может тут косяк?
Npc.so лежит в директории с .py файлом, в котором я его импортирую.



Отредактировано (Ноя. 14, 2009 00:29:41)

Офлайн

#5 Ноя. 14, 2009 07:05:01

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Boost,ImportError: dynamic module does not define init function (initN

Для начала - не должно быть одновременно Npc.py и Npc.so. У вас не тот случай?



Офлайн

#6 Ноя. 14, 2009 14:30:03

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Boost,ImportError: dynamic module does not define init function (initN

Андрей Светлов
Для начала - не должно быть одновременно Npc.py и Npc.so. У вас не тот случай?
не. я помню про это, по разному называл



Офлайн

#7 Ноя. 14, 2009 21:48:54

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Boost,ImportError: dynamic module does not define init function (initN

А про то, что Npc_wrapper.h нужно инклудить в какой-то cpp файл - тоже помните? Простое упоминание в jam нечего не даст.



Офлайн

#8 Ноя. 14, 2009 21:51:48

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Boost,ImportError: dynamic module does not define init function (initN

Да, еще. Добавьте в WorldObject публичный виртуальный деструктор и унаследуйте его от boost::noncopyable. Это избавит от ряда проблем в дальнейшем.



Офлайн

#9 Ноя. 15, 2009 00:04:35

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Boost,ImportError: dynamic module does not define init function (initN

На счет деструктора спасибо. А #include “Npc.h” в Npc_wrapper.h разве недостаточно?
На самом деле, хотелось бы обойтись минимальными изменениями (а по возможности избежать их) в исходниках библиотеки на С++, потому что ее не я разрабатывать буду.



Офлайн

#10 Ноя. 15, 2009 10:32:40

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Boost,ImportError: dynamic module does not define init function (initN

boost::noncopyable запрещает конструктор копирования и оператор присваивания.
#include “Npc.h” в Npc_wrapper.h - явно недостаточно.
Что вам на самом деле нужно - это обозвать Npc_wrapper.h как Npc_wrapper.cpp и включить его в jam. Тогда он скомпилируется, init для модуля будет в .so и т.д. Какие-то совсем очевидные вещи объясняю. Либо проблема все же не здесь - либо вы о программировании на плюсах весьма мало знаете.
.h файлы на самом деле не обрабатываются, пока не включены через include в .cpp



Отредактировано (Ноя. 15, 2009 10:33:31)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version