FPC LUA

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

FPC LUA

Сообщение vitya007 » 02.11.2016 00:17:25

Вот добавил:
Код: Выделить всё
uses lua, lualib, lauxlib;

как начал просить dll. Не очень хочется таскать с собой dll. Есть вариант подключить lib файл lua или как-то по-другому убрать зависимость dll
vitya007
новенький
 
Сообщения: 32
Зарегистрирован: 10.05.2011 22:23:27

Re: FPC LUA

Сообщение Лекс Айрин » 02.11.2016 09:31:42

Только если сам напишешь реализацию.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: FPC LUA

Сообщение runewalsh » 02.11.2016 13:25:40

Ээ, теоретически можешь сделать свой модуль из исходников этих, заменить «external %dllname%» на просто external, скомпилировать саму Луа GCC и подключить полученные .<какоетамрасширение> через {$LINKLIB %libname%}, практически скачай статическую библиотеку с https://sourceforge.net/projects/luabin ... es/Static/, попробуй скомпилировать

Код: Выделить всё
{$mode objfpc} {$h+}
{$linklib liblua53.a}

uses
  SysUtils, ctypes;

const
  LUA_OK                = 0;

  LUA_FIRSTPSEUDOIDX    = -1001000;
  LUA_REGISTRYINDEX     = LUA_FIRSTPSEUDOIDX;
  LUA_RIDX_MAINTHREAD   = 1;
  LUA_RIDX_GLOBALS      = 2;

type
  lua_State       = record ptr: pointer; end;
  lua_Alloc       = function(ud: pointer; ptr: pointer; osize, nsize: csize_t): pointer; cdecl;
  lua_Chunkreader = function(L: lua_State; ud: pointer; out sz: csize_t): pcchar; cdecl;
  lua_CFunction   = function(L: lua_State): cint; cdecl;
  lua_KContext    = PtrInt;
  lua_KFunction   = function(L: lua_State; status: cint; ctx: lua_KContext): cint; cdecl;

  function lua_newstate(f: lua_Alloc; ud: pointer): lua_State; cdecl; external;
  procedure lua_close(L: lua_State); cdecl; external;
  function lua_load(L: lua_State; reader: lua_Chunkreader; dt: pointer; chunkname, mode: pcchar): cint; cdecl; external;
  function lua_pcallk(L: lua_State; nargs, nresults, errfunc: cint; ctx: lua_KContext; k: lua_KFunction): cint; cdecl; external;
  procedure lua_settop(L: lua_State; index: cint); cdecl; external;
  procedure lua_pushlstring(L: lua_State; s: pcchar; ls: csize_t); cdecl; external;
  procedure lua_pushcclosure(L: lua_State; fn: lua_CFunction; n: cint); cdecl; external;
  procedure lua_rawgeti(L: lua_State; idx, n: cint); cdecl; external;
  procedure lua_rawset(L: lua_State; idx: cint); cdecl; external;
  function lua_tolstring(L: lua_State; idx: cint; out len: csize_t): pcchar; cdecl; external;

  procedure lua_pushstring(L: lua_State; const s: string);
  begin
    lua_pushlstring(L, pcchar(s), length(s));
  end;

  function lua_tostring(L: lua_State; idx: cint): string;
  var
    p: pcchar;
    len: csize_t;
  begin
    p := lua_tolstring(L, idx, len);
    SetLength(result, len);
    Move(p^, pointer(result)^, len * sizeof(result[1]));
  end;

type
  TLoadStringParam = record
    s: pcchar;
    rest: size_t;
  end;

  function LuaStringReader(L: lua_State; ud: pointer; out sz: csize_t): pcchar; cdecl;
  var
    p: ^TLoadStringParam absolute ud;
  begin
    result  := pcchar(p^.s);
    sz      := p^.rest * sizeof(p^.s^);
    p^.rest := 0;
  end;

  function lua_loadstring(L: lua_State; const s, name: string): cint;
  var
    p: TLoadStringParam;
  begin
    p.s    := pcchar(s);
    p.rest := length(s);
    result := lua_load(L, @LuaStringReader, @p, pcchar(name), nil);
  end;

  function lua_pcall(L: lua_State; nargs, nresults, errfunc: cint): cint;
  begin
    lua_pcallk(L, nargs, nresults, errfunc, 0, nil);
  end;

  procedure lua_pop(L: lua_State; n: cint);
  begin
    lua_settop(L, -1 - n);
  end;

  function LuaAllocator(ud: pointer; ptr: pointer; osize, nsize: csize_t): pointer; cdecl;
  begin
    Assert(@ud = @ud); Assert(@osize = @osize);
    result := ReallocMem(ptr, nsize);
  end;

  function LuaWriteln(L: lua_State): cint; cdecl;
  begin
    writeln(lua_tostring(L, 1));
    result := 0;
  end;

  function ErrorFromMessage(L: lua_State): Exception;
  begin
    result := Exception.Create(lua_tostring(L, -1));
    lua_pop(L, 1);
  end;

  procedure Main;
  const
    EOL = LineEnding;
    Script =
      'for i = 1, 10 do' + EOL +
      '  writeln("Test " .. i)' + EOL +
      'end' + EOL +
      EOL +
      'return "string result"';

  var
    L: lua_State;
  begin
    L := lua_newstate(@LuaAllocator, nil);
    if not Assigned(L.ptr) then
      raise Exception.Create('Not enough memory for Lua state.');

    lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS);
    lua_pushstring(L, 'writeln');
    lua_pushcclosure(L, @LuaWriteln, 0);
    lua_rawset(L, -3);
    lua_pop(L, 1);

    try
      if lua_loadstring(L, Script, 'test') <> LUA_OK then
        raise ErrorFromMessage(L);

      if lua_pcall(L, 0, 1, 0) <> LUA_OK then
        raise ErrorFromMessage(L);

      writeln(lua_tostring(L, -1));
      lua_pop(L, 1);

    finally
      lua_close(L);
    end;
  end;


begin
  try
    Main;
  except
    on E: Exception do writeln(E.Message);
  end;
end.
, потупи в список ошибок линковки и покорно замени назад external на external 'lua53' и положи рядом DLL. Серьёзно, ни разу не удалось заставить эту линковку работать, хотя возможность выглядит привлекательной.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

Re: FPC LUA

Сообщение vitya007 » 03.11.2016 00:08:17

runewalsh писал(а):Ээ, теоретически можешь сделать свой модуль из исходников этих, заменить «external %dllname%» на просто external, скомпилировать саму Луа GCC и подключить полученные .<какоетамрасширение> через {$LINKLIB %libname%}, практически скачай статическую библиотеку с https://sourceforge.net/projects/luabin ... es/Static/, попробуй скомпилировать

Код: Выделить всё
{$mode objfpc} {$h+}
{$linklib liblua53.a}

uses
  SysUtils, ctypes;

const
  LUA_OK                = 0;

  LUA_FIRSTPSEUDOIDX    = -1001000;
  LUA_REGISTRYINDEX     = LUA_FIRSTPSEUDOIDX;
  LUA_RIDX_MAINTHREAD   = 1;
  LUA_RIDX_GLOBALS      = 2;

type
  lua_State       = record ptr: pointer; end;
  lua_Alloc       = function(ud: pointer; ptr: pointer; osize, nsize: csize_t): pointer; cdecl;
  lua_Chunkreader = function(L: lua_State; ud: pointer; out sz: csize_t): pcchar; cdecl;
  lua_CFunction   = function(L: lua_State): cint; cdecl;
  lua_KContext    = PtrInt;
  lua_KFunction   = function(L: lua_State; status: cint; ctx: lua_KContext): cint; cdecl;

  function lua_newstate(f: lua_Alloc; ud: pointer): lua_State; cdecl; external;
  procedure lua_close(L: lua_State); cdecl; external;
  function lua_load(L: lua_State; reader: lua_Chunkreader; dt: pointer; chunkname, mode: pcchar): cint; cdecl; external;
  function lua_pcallk(L: lua_State; nargs, nresults, errfunc: cint; ctx: lua_KContext; k: lua_KFunction): cint; cdecl; external;
  procedure lua_settop(L: lua_State; index: cint); cdecl; external;
  procedure lua_pushlstring(L: lua_State; s: pcchar; ls: csize_t); cdecl; external;
  procedure lua_pushcclosure(L: lua_State; fn: lua_CFunction; n: cint); cdecl; external;
  procedure lua_rawgeti(L: lua_State; idx, n: cint); cdecl; external;
  procedure lua_rawset(L: lua_State; idx: cint); cdecl; external;
  function lua_tolstring(L: lua_State; idx: cint; out len: csize_t): pcchar; cdecl; external;

  procedure lua_pushstring(L: lua_State; const s: string);
  begin
    lua_pushlstring(L, pcchar(s), length(s));
  end;

  function lua_tostring(L: lua_State; idx: cint): string;
  var
    p: pcchar;
    len: csize_t;
  begin
    p := lua_tolstring(L, idx, len);
    SetLength(result, len);
    Move(p^, pointer(result)^, len * sizeof(result[1]));
  end;

type
  TLoadStringParam = record
    s: pcchar;
    rest: size_t;
  end;

  function LuaStringReader(L: lua_State; ud: pointer; out sz: csize_t): pcchar; cdecl;
  var
    p: ^TLoadStringParam absolute ud;
  begin
    result  := pcchar(p^.s);
    sz      := p^.rest * sizeof(p^.s^);
    p^.rest := 0;
  end;

  function lua_loadstring(L: lua_State; const s, name: string): cint;
  var
    p: TLoadStringParam;
  begin
    p.s    := pcchar(s);
    p.rest := length(s);
    result := lua_load(L, @LuaStringReader, @p, pcchar(name), nil);
  end;

  function lua_pcall(L: lua_State; nargs, nresults, errfunc: cint): cint;
  begin
    lua_pcallk(L, nargs, nresults, errfunc, 0, nil);
  end;

  procedure lua_pop(L: lua_State; n: cint);
  begin
    lua_settop(L, -1 - n);
  end;

  function LuaAllocator(ud: pointer; ptr: pointer; osize, nsize: csize_t): pointer; cdecl;
  begin
    Assert(@ud = @ud); Assert(@osize = @osize);
    result := ReallocMem(ptr, nsize);
  end;

  function LuaWriteln(L: lua_State): cint; cdecl;
  begin
    writeln(lua_tostring(L, 1));
    result := 0;
  end;

  function ErrorFromMessage(L: lua_State): Exception;
  begin
    result := Exception.Create(lua_tostring(L, -1));
    lua_pop(L, 1);
  end;

  procedure Main;
  const
    EOL = LineEnding;
    Script =
      'for i = 1, 10 do' + EOL +
      '  writeln("Test " .. i)' + EOL +
      'end' + EOL +
      EOL +
      'return "string result"';

  var
    L: lua_State;
  begin
    L := lua_newstate(@LuaAllocator, nil);
    if not Assigned(L.ptr) then
      raise Exception.Create('Not enough memory for Lua state.');

    lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS);
    lua_pushstring(L, 'writeln');
    lua_pushcclosure(L, @LuaWriteln, 0);
    lua_rawset(L, -3);
    lua_pop(L, 1);

    try
      if lua_loadstring(L, Script, 'test') <> LUA_OK then
        raise ErrorFromMessage(L);

      if lua_pcall(L, 0, 1, 0) <> LUA_OK then
        raise ErrorFromMessage(L);

      writeln(lua_tostring(L, -1));
      lua_pop(L, 1);

    finally
      lua_close(L);
    end;
  end;


begin
  try
    Main;
  except
    on E: Exception do writeln(E.Message);
  end;
end.
, потупи в список ошибок линковки и покорно замени назад external на external 'lua53' и положи рядом DLL. Серьёзно, ни разу не удалось заставить эту линковку работать, хотя возможность выглядит привлекательной.


Спасибо, что подсказал куда капать. Нашел в папке units\lua файлы (*.a) как я понял это либы для GCC. сделал вот так:

Код: Выделить всё
program test;
{$H+}

uses lua, lualib, lauxlib;

{$LINKLIB libimplua.a}
{$LINKLIB libimplualib.a}
{$LINKLIB libimplauxlib.a}


begin

end.


правда 5.1 версия, но работает. больше не требует dll. попробую что-нибудь добавить

______________________

С новой либой тоже завелась

Код: Выделить всё
program test;
{$H+}

uses lua, lualib, lauxlib;

//{$LINKLIB libimplua.a}
{$LINKLIB liblua53.a}
{$LINKLIB libimplualib.a}
{$LINKLIB libimplauxlib.a}


begin

end.
vitya007
новенький
 
Сообщения: 32
Зарегистрирован: 10.05.2011 22:23:27

Re: FPC LUA

Сообщение runewalsh » 03.11.2016 00:26:47

А ты вызови что-нибудь, неиспользуемые функции не линкуются.
Для импорта из статической библиотеки нужна именно external без имени библиотеки, насколько я знаю (и линкер будет очень некрасиво ругаться без подсветки строки, если функцию не найдёт). А в этих модулях external LUA_NAME; — синтаксис для динамических.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

Re: FPC LUA

Сообщение скалогрыз » 03.11.2016 00:34:26

runewalsh, проблемы с Си++ исключенияи из lua модулей решил как-нибудь?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: FPC LUA

Сообщение vitya007 » 03.11.2016 00:49:33

runewalsh писал(а):А ты вызови что-нибудь, неиспользуемые функции не линкуются.
Для импорта из статической библиотеки нужна именно external без имени библиотеки, насколько я знаю (и линкер будет очень некрасиво ругаться без подсветки строки, если функцию не найдёт). А в этих модулях external LUA_NAME; — синтаксис для динамических.



Ты прав. :(
Но все равно требует dll

Код: Выделить всё
program test;
{$H+}

uses lua, lualib, lauxlib;

{$LINKLIB libimplua.a}
//{$LINKLIB liblua53.a}
{$LINKLIB libimplualib.a}
{$LINKLIB libimplauxlib.a}

function _luaL_newstate(): Plua_State; cdecl; external;
procedure _luaL_openlibs(L: Plua_State); cdecl; external;
procedure _lua_close(L: Plua_State); cdecl; external;

procedure Main;
var
   L: Plua_State;
begin
   L := luaL_newstate();
   luaL_openlibs(L);
   
   lua_close(L);
end;

begin
   Main;
   Write('Exit..');
   Readln();
end.
vitya007
новенький
 
Сообщения: 32
Зарегистрирован: 10.05.2011 22:23:27

Re: FPC LUA

Сообщение скалогрыз » 03.11.2016 00:51:47

vitya007 писал(а):Но все равно требует dll

? в run-time что ли? или на стадии компоновки?
текст ошибки какой?

Вообще-то, согласно твоего объявления функций, код должен быть таким:
Код: Выделить всё
procedure Main;
var
   L: Plua_State;
begin
   L := _luaL_newstate();
   _luaL_openlibs(L);
   
   _lua_close(L);
end;

иначе в поиске функции lua_newstate() он полезет в модули с загрузкой .dll-ки
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: FPC LUA

Сообщение vitya007 » 03.11.2016 00:56:27

скалогрыз писал(а):
vitya007 писал(а):Но все равно требует dll

? в run-time что ли? или на стадии компоновки?
текст ошибки какой?

Вообще-то, согласно твоего объявления функций, код должен быть таким:
Код: Выделить всё
procedure Main;
var
   L: Plua_State;
begin
   L := _luaL_newstate();
   _luaL_openlibs(L);
   
   _lua_close(L);
end;

иначе в поиске функции lua_newstate() он полезет в модули с загрузкой .dll-ки


в RT

Ошибок нету, но если сделать как ты говоришь, то получится вот это
Код: Выделить всё
program test;
{$H+}

uses lua, lualib, lauxlib;

{$LINKLIB libimplua.a}
//{$LINKLIB liblua53.a}
{$LINKLIB libimplualib.a}
{$LINKLIB libimplauxlib.a}

function _luaL_newstate(): Plua_State; cdecl; external;
procedure _luaL_openlibs(L: Plua_State); cdecl; external;
procedure _lua_close(L: Plua_State); cdecl; external;

procedure Main;
var
   L: Plua_State;
begin
   L := _luaL_newstate();
   _luaL_openlibs(L);
   
   _lua_close(L);
end;

begin
   Main;
   Write('Exit..');
   Readln();
end.


Код: Выделить всё
test.pas(27,16) Error: Undefined symbol: __luaL_newstate
test.pas(27,16) Error: Undefined symbol: __luaL_openlibs
test.pas(27,16) Error: Undefined symbol: __lua_close
vitya007
новенький
 
Сообщения: 32
Зарегистрирован: 10.05.2011 22:23:27

Re: FPC LUA

Сообщение скалогрыз » 03.11.2016 00:58:52

vitya007 писал(а):Ошибок нету, но если сделать как ты говоришь, то получится вот это

а вот это ожидаемый результат ;)
попробуй так:
Код: Выделить всё
program test;
{$H+}

uses lua, lualib, lauxlib;

{$LINKLIB libimplua.a}
//{$LINKLIB liblua53.a}
{$LINKLIB libimplualib.a}
{$LINKLIB libimplauxlib.a}

function luaL_newstate(): Plua_State; cdecl; external;
procedure luaL_openlibs(L: Plua_State); cdecl; external;
procedure lua_close(L: Plua_State); cdecl; external;

procedure Main;
var
   L: Plua_State;
begin
   L := luaL_newstate();
   luaL_openlibs(L);
   
   lua_close(L);
end;

begin
   Main;
   Write('Exit..');
   Readln();
end.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: FPC LUA

Сообщение Дож » 03.11.2016 01:00:56

скалогрыз писал(а):runewalsh, проблемы с Си++ исключенияи из lua модулей решил как-нибудь?

Так он же написан на С (а не С++) и "легковесно", какие там могут быть C++ исключения?
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: FPC LUA

Сообщение vitya007 » 03.11.2016 01:01:19

скалогрыз писал(а):
vitya007 писал(а):Ошибок нету, но если сделать как ты говоришь, то получится вот это

а вот это ожидаемый результат ;)
попробуй так:
Код: Выделить всё
program test;
{$H+}

uses lua, lualib, lauxlib;

{$LINKLIB libimplua.a}
//{$LINKLIB liblua53.a}
{$LINKLIB libimplualib.a}
{$LINKLIB libimplauxlib.a}

function luaL_newstate(): Plua_State; cdecl; external;
procedure luaL_openlibs(L: Plua_State); cdecl; external;
procedure lua_close(L: Plua_State); cdecl; external;

procedure Main;
var
   L: Plua_State;
begin
   L := luaL_newstate();
   luaL_openlibs(L);
   
   lua_close(L);
end;

begin
   Main;
   Write('Exit..');
   Readln();
end.


Код: Выделить всё
test.pas(27,16) Error: Undefined symbol: _luaL_newstate
test.pas(27,16) Error: Undefined symbol: _luaL_openlibs
test.pas(27,16) Error: Undefined symbol: _lua_close
vitya007
новенький
 
Сообщения: 32
Зарегистрирован: 10.05.2011 22:23:27

Re: FPC LUA

Сообщение скалогрыз » 03.11.2016 01:03:38

vitya007 опубликуй где-нить .а файлы? (или сюда приаттачь)

Добавлено спустя 1 минуту 38 секунд:
Дож писал(а):Так он же написан на С (а не С++) и "легковесно", какие там могут быть C++ исключения?


отвечу ссылкой на ссылку :D
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: FPC LUA

Сообщение vitya007 » 03.11.2016 01:08:28

скалогрыз писал(а):vitya007 опубликуй где-нить .а файлы? (или сюда приаттачь)


Вообще они тут лежат "FPC\3.0.0\units\i386-win32\lua", но в проект положил.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
vitya007
новенький
 
Сообщения: 32
Зарегистрирован: 10.05.2011 22:23:27

Re: FPC LUA

Сообщение скалогрыз » 03.11.2016 01:11:29

vitya007 писал(а):Вообще они тут лежат "FPC\3.0.0\units\i386-win32\lua"

понятно. это не то.
эти библиотеки, то что для себя FPC наварил, а не самая люа для статический линковки

Давай-ка мы либу вот от сюда попробуем?!
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

След.

Вернуться в Free Pascal Compiler

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24

Рейтинг@Mail.ru