Найти - Пользователи
Полная версия: Boost,ImportError: dynamic module does not define init function (initN
Начало » Python для новичков » Boost,ImportError: dynamic module does not define init function (initN
1 2
pasaranax
Я хочу сделать обертку для класса на С++ с помощью 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 такое же, но все равно та же ошибка. Такое ощущение, что я не вижу какой-то глупой опечатки. Покажите, пожалуйста, в чем ошибка?
pasaranax
Неужели, никто не работал с boost? Может тогда подскажете еще простой способ сделать обертку для с++ библиотеки или как вручную добавить init функцию?
Андрей Светлов
Отчего же, работал. Но у тебя все правильно описано.
Остается только убедиться, что имя модуля Npc.so (linux?) и в нем есть имя _initNpc - и все должно быть нормально.
По крайней мере то, что я вижу - корректное.
pasaranax
Имя модуля правильное. А как посмотреть наличие в нем этого имени? `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 файлом, в котором я его импортирую.
Андрей Светлов
Для начала - не должно быть одновременно Npc.py и Npc.so. У вас не тот случай?
pasaranax
Андрей Светлов
Для начала - не должно быть одновременно Npc.py и Npc.so. У вас не тот случай?
не. я помню про это, по разному называл
Андрей Светлов
А про то, что Npc_wrapper.h нужно инклудить в какой-то cpp файл - тоже помните? Простое упоминание в jam нечего не даст.
Андрей Светлов
Да, еще. Добавьте в WorldObject публичный виртуальный деструктор и унаследуйте его от boost::noncopyable. Это избавит от ряда проблем в дальнейшем.
pasaranax
На счет деструктора спасибо. А #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
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