Wednesday, June 07, 2006

Lua

Уф... похоже битва с Lua и luabind закончилась моей победой.
Сначала я сбилдил lua.lib через msys, просто под mingw. Но в таком варианте там тольео билдинг dll, что вообщем-то мне не надо, не хочу плодить дллки. Тогда сбилдил либу вроде под posix, получил заветный liblua.a, переименовал её в lua.lib и подключил к своему проекту.
Вот зачто я испытываю нежные чувства к языку Си, являясь адептом С++, так за то, что можно сбилдить либу на одном компиляторе, а слинковать совсем на другом. Главное что бы формат объектников совпадал, к счатью и mingw и vc используют coff формат, во всём остальном ABI у них идентичный.
Всё было бы замечательно, если бы не одно но. В отладочной конфигурации у меня проект собирался без проблем и луа работала как надо. Но стоило сбилдить его в релизе, как начинались непонятные глюки. Линкер ругался, что отсутсвуют функции из lua.lib, причем имена функций начинались без подчеркиваний, что не соответсвует cdecl конвенции. Я так не разобрался, что это значит, но по-моему, такие имена у функций в либах, которые указывают на dll. Потом к ним прибавляется префкис __imp_. Так вот, как бы я не менял конфигурации проекта, сколько бы не копался в его настройках, но в релизе из под студии линковаться он у меня отказывался. При этом у меня вместо экзешника появлялись .lib и .exp файлы. Откуда? Я так и не понял.
Удивительнее всего оказалось то, что билдинг релиза используя boost.build работал без проблем. Чудеса да и только.
Совсем отчаявшись, я подумал что придется руками собирать библиотеку Луа в студии. Но вместо этого скомпилировал её в ansi конфигурации. И в моём проекта она вполне корректно слинковалась! Видимо я напоролся на какой-то баг линкера, который присутсвует как в VC7.1, так и в VC8.0.

С компиляцией lualib у меня проблем тоже вроде не было. Хоть это и С++ библиотека, но она использует boost.build для сблорки, а я с ним вполне так дружу :). Слинковалась библиотека с моим проектом тоже без проблем. Но вот работать отказывалась. Падала с совсем непонятными ошибками, в совершенно неожиданных местах. То есть там, где по логике вообще падать не должно. И еще все тесты оказались проваленными.
Тут я тоже промучался несколько часов, пока не заметил, что у меня путь к бусту в project-root.jam прописан не совсем правильно. У меня использывался буст из CVS репозитория, а он там очень корявый лежит. Исправил проблему, прописав путь к дистрибутиву 1.33.1 и всё заработало. Хотя под vc8.0 несколько тестов всё же провалилось, а в vc7.1 все прошли успешно. Странно как-то.
Кстати, версия luabind из sourceforge не работает с последней версией lua5.1, надо забирать luabind из CVS. Тоже весьма неприятный момент.

Но к счастью, весь этот секс остался позади. И теперь у меня открылись новые архитектурные возможности. Например используя скрипты будет проще наладить взаимодействие между потоком, обрабатывающим GUI и основным потоком приложения. Так как задавать отложенные скрипты всё же лаконичнее, чем задавать отложенные функции. Хотя второе и удобно благодоря boost::lambda, но всё же С++, к сожалению, не функциональный язык и boost::lambda не может придать ему всех свойств ФЯ.