(LUA+FPC) Статическая линковка.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

(LUA+FPC) Статическая линковка.

Сообщение napalmus » 24.07.2012 22:42:45

Пытаюсь собрать проект с LUA используя объектный файл библиотеки liblua.a скомпилированный при помощи mingw32 и makefile с флагом -DLUA_ANSI.
Для MacOS и Андроида способ работает, правда там liblua.a получал другим путём. Но главное что получилось, а вот в виндах одна ошибка:
Код: Выделить всё
Error: Undefined symbol: ___strtod

Способ подключения liblia.a:
Код: Выделить всё
  {$LINKLIB liblua.a} 

Обнаружил что функция strtod используется в файле "src/luaconf.h" :
Код: Выделить всё
#define lua_str2number(s,p)   strtod((s), (p))   //lua_str2number converts a string to a number.


Может кто уже сталкивался или знает как такое обойти. Пожалуйста, подскажите.
napalmus
незнакомец
 
Сообщения: 8
Зарегистрирован: 28.03.2012 02:26:28

Re: (LUA+FPC) Статическая линковка.

Сообщение hinst » 26.07.2012 15:44:55

а что, разве .а-файлы не платформенно-зависимы? надо следить чтобы под виндой линковались виндовые .a-файлы
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: (LUA+FPC) Статическая линковка.

Сообщение napalmus » 26.07.2012 18:08:08

hinst пардон, забыл добавить что liblua.a собраны каждая для своей платформы. В Windows я пользовался mingw и makefile выбрал ключ ansi. Для других платформ были другие инструменты и манипуляции.
Проблема в том что для сборки проекта с liblua.a скорее всего нужно перекрыть функцию lua_str2number(s,p) в которой используется сишная библиотечная ф-ция strtod((s), (p)), или же слинковать и её, что мне кажется более сложная задача.
В моём врапере для LUA есть копия её реализации на паскале:
Код: Выделить всё
function lua_str2number(s: String): Lua_Number;
begin
  Result := StrToFloat( s );
end;

Возможно мне нужны дополнительные директивы или флаги чтобы перекрыть одноимённую сишную ф-цию, чтобы liblua.a обращалась к ней, а не своей внутренней. По идее тогда должно собраться без той ошибки. Но я не знаю как правильно оформить такую запись :(

Добавлено спустя 12 минут 17 секунд:
Может кто уже пробовал делать статическую линковку для LUA, поделитесь опытом, пожалуйста.
Если честно, меня также интересует опыт с iOS :oops: . С этой платформой я тоже использовал liblua.a, и даже слинковалось, но случилась другая беда lua_pushinteger(LuaInstance, 5), работает, а вот на lua_pushstring(LuaInstance, 'dhjkjk') падает как будто со строковыми данными что то не чисто :(
napalmus
незнакомец
 
Сообщения: 8
Зарегистрирован: 28.03.2012 02:26:28

Re: (LUA+FPC) Статическая линковка.

Сообщение Sergei I. Gorelkin » 26.07.2012 19:15:46

Чтобы перекрыть (число подчеркиваний перед strtod подобрать по вкусу):
function lua_str2number(s: String): Lua_Number;[public name '__strtod'];

Чтобы слинковать, нужно добавить к проекту msvcrt.lib или что-то наподобие (раньше можно было написать function _strtod(...):lua_number; external 'msvcrt.dll', теперь нельзя из-за одного патча с сомнительной ценностью).
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: (LUA+FPC) Статическая линковка.

Сообщение Mr.Smart » 26.07.2012 20:26:49

А lua_pushstring(LuaInstance, PChar('dhjkjk')) тоже падает?
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: (LUA+FPC) Статическая линковка.

Сообщение napalmus » 26.07.2012 22:54:38

Sergei I. Gorelkin Спасибо, большое! :) Вот такая запись помогла полностью собрать:
Код: Выделить всё
function strtod(s: PAnsiChar; p: Pointer): lua_Number; cdecl; public name '___strtod';

function strtod(const s: PAnsiChar; var p: Pointer): lua_Number; cdecl;
begin
  Result := StrToFloat( s );
  p := PAnsiChar('');
end;

Без этой строки p := PAnsiChar(''); вылетало. Однако не уверен что правильно её использую, так что сильно не пинать, если что %)

Mr.Smart Пробовал и PChar и PAnsiChar не помогает, падает хоть ты тресни :( Не пойму, для эмулятора всё работает, а для девайса строки не хочет push-ить :(
napalmus
незнакомец
 
Сообщения: 8
Зарегистрирован: 28.03.2012 02:26:28

Re: (LUA+FPC) Статическая линковка.

Сообщение Mr.Smart » 26.07.2012 23:12:14

iOS с LUA не теребил, а вот если без линковки, а обращаться к .dylib (с iOS не знаком, но подозреваю, что от MacOS X не сильно отличается)?

Добавлено спустя 1 минуту 17 секунд:
Да вопрос то не задал :oops:
В смысле будут ли данные ошибки, если использовать динамическую библиотек?
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: (LUA+FPC) Статическая линковка.

Сообщение napalmus » 26.07.2012 23:46:04

Mr.Smart Честно говоря, динамическую библиотеку не собирал. Для iOS динамическая линковка запрещена лицензией, потому и мучусь с liblua.a. Да и не уверен что есть возможность под iOS собирать динлибки.
iOS это arm-платформа потому Mac-овские либки точно не подойдут. Да и дело наверно не в либках. Возможно нужно как и в случае с strtod перекрывать pushstring, но это уже будет чуть сложнее. Знать бы почему не хочет :)

Добавлено спустя 2 часа 28 минут 44 секунды:
Решил натыкать printf в луа код, чтоб вычислить конкретное место падения, сделал так:
Код: Выделить всё
LUA_API void lua_pushlstring (lua_State *L, const char *s, size_t len) {
  printf ("test1"); 
  lua_lock(L);
  printf ("test2"); 
  luaC_checkGC(L);
  printf ("test3"); 
  setsvalue2s(L, L->top, luaS_newlstr(L, s, len));
  printf ("test4"); 
  api_incr_top(L);
  printf ("test5"); 
  lua_unlock(L);
  printf ("test6"); 
}


В итоге был удивлён, с принтами всё заработало, мистика какая то. Если принты убрать то крашится. Как такое может быть?
napalmus
незнакомец
 
Сообщения: 8
Зарегистрирован: 28.03.2012 02:26:28

Re: (LUA+FPC) Статическая линковка.

Сообщение Sergei I. Gorelkin » 27.07.2012 14:40:43

Возможно, где-то не совпадают типы вызвов (cdecl?). Может быть нужно подключить модуль ctypes и использовать сишные типы данных вместо паскалевских. Наконец, gcc и msvc генерируют разный код для функций, возвращающих значения с плавающей запятой, из-за чего FPC физически не может быть совместим с любым сишным кодом.
Короче говоря, нужно раскуривать ABI и изучать ассемблерные листинги...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: (LUA+FPC) Статическая линковка.

Сообщение napalmus » 27.07.2012 18:27:59

Sergei I. Gorelkin Снова спасибо, за участие, две недели потратил, на разного рода эксперименты с этой проблемой, но ни разу не догадался собрать весь проект с другой версией arm. Всё время работал с armv6. Просто изначально планировал под эту версию собирать. А тут собрал с armv7, запустил и заработало.
В настройках проекта lua который я использовал для получения liblua.a в графе Architectures изначально стояло armv7, я проявил самодеятельность и поменял на armv6. Либку получил, но видимо недостаточно было просто изменить эту графу. Тоже в общем странно :(. Надо почитать мануалы по данной проблеме.
А после вашего поста, вдруг мысль пришла проверить на другой arm.
napalmus
незнакомец
 
Сообщения: 8
Зарегистрирован: 28.03.2012 02:26:28


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 241

Рейтинг@Mail.ru