boost.python
От: ezdoctor  
Дата: 08.10.13 16:36
Оценка:
Добрый день,

Пытаюсь установить boost с целью расширения python на плюсах. По факту так и не смог слинковать libs\python\example\tutorial, чуть что — билд падает с ошибкой unresolved external.
Windows 7, Python 2.7
Найдется кто-нибудь, кто с задачей справился, и может объяснить, как обходятся грабли?
Re: boost.python
От: visual_wind  
Дата: 09.10.13 11:25
Оценка: 4 (1)
Здравствуйте, ezdoctor, Вы писали:

E>Добрый день,


E>Пытаюсь установить boost с целью расширения python на плюсах. По факту так и не смог слинковать libs\python\example\tutorial, чуть что — билд падает с ошибкой unresolved external.

E>Windows 7, Python 2.7
E>Найдется кто-нибудь, кто с задачей справился, и может объяснить, как обходятся грабли?

Я использовал boost.python под Win7, правда, с Python 3 и под MinGW. Брал 32-разрядные версии Питона и MinGW
Последовательность встраивания Питона следующая:

1. Добавляем в настройках компилятора для проекта пути к бусту, и питоновским инклудам. В моем случае это было
"D:\Local\boost_1_54_0"
"D:\Local\Python33\include"

2. Указываем в настройках линкера для проекта какие либы нам требуются (не забывая питоновскую и предварительно скомпиленную буст-питоноскую либы). В моем случае это было
ws2_32
boost_system-mgw48-mt-s-1_54
boost_python3-mgw48-mt-s-1_54
python33

3. Добавляем в настройках линкера для проекта пути для либ и п.2. В моем случае это было
"D:\Local\boost_1_54_0\stage\lib"
"D:\Local\Python33\libs"

4. Далее берем какой-нибудь простейший пример helloworld, который запускает питоновский скрипт с импортом плюсовой длл-ки, сделанной с помощью буст пайтона. Например, вот отсюда.

5. Определяем в исходном плюсовом файле макрос
#define BOOST_PYTHON_STATIC_LIB
и не забываем подключить буст-питоноский хэдер
#include <boost/python.hpp>

6. Компилим плюсовый файл в динамическую библиотеку, получая на выходе длл. Расширение .dll необходимо переименовать в .pyd.

7. Запускаем питоновский скрипт в интерпретаторе, импортим наш .pyd, вызываем из него, что хотели. Все должно работать.
Re[2]: boost.python
От: ezdoctor  
Дата: 09.10.13 18:55
Оценка:
Здравствуйте, visual_wind, Вы писали:

_>Здравствуйте, ezdoctor, Вы писали:


E>>Добрый день,


E>>Пытаюсь установить boost с целью расширения python на плюсах. По факту так и не смог слинковать libs\python\example\tutorial, чуть что — билд падает с ошибкой unresolved external.

E>>Windows 7, Python 2.7
E>>Найдется кто-нибудь, кто с задачей справился, и может объяснить, как обходятся грабли?

_>Я использовал boost.python под Win7, правда, с Python 3 и под MinGW. Брал 32-разрядные версии Питона и MinGW

_>Последовательность встраивания Питона следующая:

_>1. Добавляем в настройках компилятора для проекта пути к бусту, и питоновским инклудам. В моем случае это было

_>"D:\Local\boost_1_54_0"
_>"D:\Local\Python33\include"

_>2. Указываем в настройках линкера для проекта какие либы нам требуются (не забывая питоновскую и предварительно скомпиленную буст-питоноскую либы). В моем случае это было

_>ws2_32
_>boost_system-mgw48-mt-s-1_54
_>boost_python3-mgw48-mt-s-1_54
_>python33

_>3. Добавляем в настройках линкера для проекта пути для либ и п.2. В моем случае это было

_>"D:\Local\boost_1_54_0\stage\lib"
_>"D:\Local\Python33\libs"

_>4. Далее берем какой-нибудь простейший пример helloworld, который запускает питоновский скрипт с импортом плюсовой длл-ки, сделанной с помощью буст пайтона. Например, вот отсюда.


_>5. Определяем в исходном плюсовом файле макрос

_>#define BOOST_PYTHON_STATIC_LIB
_>и не забываем подключить буст-питоноский хэдер
_>#include <boost/python.hpp>

_>6. Компилим плюсовый файл в динамическую библиотеку, получая на выходе длл. Расширение .dll необходимо переименовать в .pyd.


_>7. Запускаем питоновский скрипт в интерпретаторе, импортим наш .pyd, вызываем из него, что хотели. Все должно работать.


Я залип на втором пункте. Фактически проект требует подключить boost_python-vc100-mt-gd-1_54.lib, но либы с таким названием нигде обнаружить не удается. Наиболее похожее название у либы libboost_python-vc100-mt-gd-1_54.lib, но эта библиотека не заменяет искомую: остается большое количество unresolved externals с префиксом __imp___Py.
А где найти что-то похожее на boost_system-mgw48-mt-s-1_54?
Re[3]: boost.python
От: nen777w  
Дата: 09.10.13 20:00
Оценка:
E>Я залип на втором пункте. Фактически проект требует подключить boost_python-vc100-mt-gd-1_54.lib, но либы с таким названием нигде обнаружить не удается. Наиболее похожее название у либы libboost_python-vc100-mt-gd-1_54.lib, но эта библиотека не заменяет искомую: остается большое количество unresolved externals с префиксом __imp___Py.
E>А где найти что-то похожее на boost_system-mgw48-mt-s-1_54?

Я надеюсь вы не руками их подключаете?
Для cl компилера у boost-а есть автолинковка.. через #pragma comment(lib, бла бла бла)
Теперь смотрим где сие чудо происходит... ага...

boost_1_54_0\boost\config\auto_link.hpp


Смотрим внутрь, чего там с питоном связано... Ага...
По все видимости должен быть предефайн BOOST_LINKING_PYTHON, надо попробовать, но я сомневаюсь, потому что помню что было достаточно только предефайна BOOST_PYTHON_STATIC_LIB
из boost_1_54_0\boost\python\detail\config.hpp

Деталей к сожалению не помню, но проект могу поднять посмотреть, если не разберетесь.

Еще парочку полезных предефайнов:
BOOST_PYTHON_MAX_ARITY

The maximum arity of any function, member function, or constructor to be wrapped, invocation of a Boost.Python function wich is specified as taking arguments x1, x2,...Xn. This includes, in particular, callback mechanisms such as object::operator()(...) or call_method<R>(... ).

BOOST_PYTHON_MAX_BASES

The maximum number of template arguments to the bases<...> class template, which is used to specify the bases of a wrapped C++ class


Мне в том проекте приходилось это подстраивать. Вообще линка по конфигурации тут

Да! Кстати поищите мои темы тут на RSDN со строкой поиска "boost python".
У этой либы есть одна не решенная на сколько я знаю до сиих пор проблема с выгрузкой python — dll, из-за (как я разобрался) двойного LoadLibrary.
Детали и мой солюшен в этой теме
Автор: nen777w
Дата: 29.02.12
.
Re[3]: boost.python
От: visual_wind  
Дата: 10.10.13 07:02
Оценка:
Здравствуйте, ezdoctor, Вы писали:

E>Я залип на втором пункте. Фактически проект требует подключить boost_python-vc100-mt-gd-1_54.lib, но либы с таким названием нигде обнаружить не удается. Наиболее похожее название у либы libboost_python-vc100-mt-gd-1_54.lib, но эта библиотека не заменяет искомую: остается большое количество unresolved externals с префиксом __imp___Py.

E>А где найти что-то похожее на boost_system-mgw48-mt-s-1_54?

1. При линковке со статическими библиотеками, именующимися по типу lib*.*, при их добавлении в свойства проекта необходимо опускать как расширение .*, так и префикс lib. Итого — при добавлении libboost_python-vc100-mt-gd-1_54.lib ее имя преобразуется в boost_python-vc100-mt-gd-1_54.

2. Безразлично, чем компилить буст — студией или MinGW. Я компилил MinGW, вы — 10-й студией. Названия компиляторов фигурируют в названии либ, потому что по умолчанию в виндах при компиляции буста стоит --layout=versioned. Вы можете использовать ту библиотеку, что есть у вас, boost_system-mgw48-mt-s-1_54 вам не нужна.

3. Трудно угадать, но причины вашей проблемы могут быть следующими:

— у вас на машине несколько версий Питона и берется неправильная версия или версия одна, но путь к ней не добавлен в системные пути или требуется 32-разрядный Питон, а вы используете 64-разрядный;

— вы используете буст, который уже был кем-то скомпилирован, но вы используете не ту версию Питона, под которую был скомпилирован буст.Питон. Надо либо узнать, с какой версией Питона компилировался буст.Питон и поставить себе такую же либо перекомпилировать буст со свой версией Питона;

— может быть и еще что-то, чего я не знаю

4. В любом случае, приведите полностью сообщения об ошибках, которые выдает компилятор.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.