Найти - Пользователи
Полная версия: Boost,ImportError: dynamic module does not define init function (initN
Начало » Python для новичков » Boost,ImportError: dynamic module does not define init function (initN
1 2
pasaranax
Да уж, я действительно в С++ не силен, хотя целую книжку Страуструпа осилил, но всю жизнь думал, что .h и .cpp - это всего лишь формальность.
Кажется, эта проблема меня миновала. Но теперь новая вылезла, хоть я все упростил до безобразия.
Npc.h:
class Npc{
public:
int hello(){ return 42; }
};
generate_code.py:
from pyplusplus import module_builder

mb = module_builder.module_builder_t(["Npc.h"], gccxml_path="/usr/bin/gccxml")
mb.build_code_creator( module_name='Wrap' )
mb.write_module( './Wrap.cpp' )
Wrap.cpp:
// This file has been generated by Py++.

#include "boost/python.hpp"

#include "Npc.h"

namespace bp = boost::python;

BOOST_PYTHON_MODULE(Wrap){
bp::class_< Npc >( "Npc" )
.def(
"hello"
, (int ( ::Npc::* )( ) )( &::Npc::hello ) );
}
jamroot:
using gcc ;
using python ;
python-extension Wrap :
Npc.h
Wrap.cpp
;
потом делаю `import Wrap` и получаю: ImportError: ./Wrap.so: undefined symbol: _ZTIN5boost6python15instance_holderE
и еще модуль собирается в директории debug и весит иногда под мегабайт, это так и должно быть или можно его собрать без дебагинговой информации?
Андрей Светлов
а вы boost собирали? Должен быть установлен в системе или через bjam install или через package manager. Не находит именно имя из boost_python_<version>.so Или не видит этот файл, или его просто нет. Или он собран с несовместимыми настройками.
pasaranax
У меня дистрибутив Gentoo, версии boost 1.35 и 1.39, /usr/lib/boost-1_35(39)/libboost_python.so имеется, собран вот с такими флагами. Bjam тоже соответствующих версий с флагом python.
Меня смущает, что модуль собирается в режиме debug (и я не знаю как это поменять), а то вот тут прочитал, что должно быть соответствие. Может в этом проблема?
Извиняюсь, если замучил вопросами, просто мне очень нужно научиться, но я не знаю в какую сторону двигаться
Андрей Светлов
Во первых, в libs/python/example/tutorial - примитивный пример. Попробуйте его.
Во вторых, bjam использовать не обязательно - это всего лишь “еще один make”. Можете собирать чем вам удобно.
Еще стоит запустить bjam –help, если хотите таки с bjam.

Properties:

toolset=toolset Indicates the toolset to build with.

variant=debug|release Select the build variant

link=static|shared Whether to build static or shared libraries

threading=single|multi Whether to build single or multithreaded binaries

runtime-link=static|shared
Whether to link to static or shared C and C++ runtime.
pasaranax
Преогромнейшее спасибо, Андрей! Действительно имена не находились потому что надо было указать путь к библиотеке в jam файле, вроде того:
project : requirements <library>/usr/lib/boost-1_35/libboost_python.so ;
И спасибо за остальной ликбез, оно не пройдет даром. В том числе на счет Propertirs, в bjam –help я такого не находил. А использовать именно bjam рекомендует документация аргументируя тем, что “большинство ошибок, что что-то не собирается происходит из-за того, что используется не bjam”.
За 5 дней мучений определенно получил левел ап.
Андрей Светлов
Кушайте на здоровье. Позже, наверное, наткнетесь еще на рад сложностей:
- как все правильно распихать?
- как работать с python <=> C++ conversions, что нужно и что нет? policy там всякие…
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