Форум сайта python.su
Я хочу сделать обертку для класса на С++ с помощью 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_ */
#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") ) );
}
Офлайн
Неужели, никто не работал с boost? Может тогда подскажете еще простой способ сделать обертку для с++ библиотеки или как вручную добавить init функцию?
Офлайн
Отчего же, работал. Но у тебя все правильно описано.
Остается только убедиться, что имя модуля Npc.so (linux?) и в нем есть имя _initNpc - и все должно быть нормально.
По крайней мере то, что я вижу - корректное.
Офлайн
Имя модуля правильное. А как посмотреть наличие в нем этого имени? `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++ файл
;
Отредактировано (Ноя. 14, 2009 00:29:41)
Офлайн
Для начала - не должно быть одновременно Npc.py и Npc.so. У вас не тот случай?
Офлайн
Андрей Светловне. я помню про это, по разному называл
Для начала - не должно быть одновременно Npc.py и Npc.so. У вас не тот случай?
Офлайн
А про то, что Npc_wrapper.h нужно инклудить в какой-то cpp файл - тоже помните? Простое упоминание в jam нечего не даст.
Офлайн
Да, еще. Добавьте в WorldObject публичный виртуальный деструктор и унаследуйте его от boost::noncopyable. Это избавит от ряда проблем в дальнейшем.
Офлайн
На счет деструктора спасибо. А #include “Npc.h” в Npc_wrapper.h разве недостаточно?
На самом деле, хотелось бы обойтись минимальными изменениями (а по возможности избежать их) в исходниках библиотеки на С++, потому что ее не я разрабатывать буду.
Офлайн
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)
Офлайн