これは常にフレームワーク上で開発されており、スカイネットの利点の1つは、luaを使用してロジックを記述できることです。そのため、C呼び出しluaを自分で試したことはありません。現在、aiをトレーニングしており、これを行う。
最初に概念を補足します。
1. Cは自身のメモリを管理し、適用して解放する必要があります
2. Luaは自動的にメモリを管理し、参照されない変数は定期的にGCになります
次に、cがluaを呼び出す場合、lua変数が解放されると、それは悲劇になります。したがって、常にlua変数を参照するには、1つのことを使用する必要があります。Cとluaの間の相互作用は、仮想スタックを使用して相互作用することです(個人的な理解)。
以下はコードです。これらのCはLuaのAPIを使用して特定の用途を確認できます。
lua 5.3中国語リファレンスマニュアルアドレスを添付してください:https://www.runoob.com/manual/lua53doc/contents.html#contents
1.以下はCコードです
#include <stdio.h>
extern "C"
{
#include "lua.h"
#include "lauxlib.h" //这里需要真tm的注意,不是luaxlib
#include "lualib.h"
}
//调用lua中的add函数
int call_lua_add(lua_State *L)
{
lua_getglobal(L, "add"); //把虚拟机中全局变量 add 压入虚拟机L的栈,这里注意,一定要是全局变量
lua_pushnumber(L, 123); //第一个参数入栈
lua_pushnumber(L, 456); //第二个参数入栈
lua_call(L, 2, 1); //调用栈中的add函数,2个参数,1个返回值
int sum = (int)lua_tonumber(L, -1); //获取栈顶元素(上一步的返回值)
lua_pop(L, 1); //栈顶元素出战
return sum;
}
int main()
{
lua_State *L = luaL_newstate(); //新建lua虚拟机
luaL_openlibs(L); //在虚拟机中载入lua所有函数库
luaL_dofile(L, "Test.lua"); //加载 并 运行指定的文件
lua_settop(L, 0); //重新设置栈底,这个过程,是为了确认栈底是空的,以便后面的操作是按照顺序入栈的且从1号栈位开始
int ret = call_lua_add(L);
printf("调用lua文件结果为 %d\n", ret);
lua_close(L); //一定记得关闭虚拟机
return 0;
}
2.以下はluaコードです
function add( x, y )
return x+y
end
print("你终于动手了")
3. cファイルをコンパイルして、エラーが報告されていることを確認します。理由は、ヘッダーファイルが見つからない、つまり環境が指定されていないためです。
4.簡単に見つけます
4.次にコンパイルし、-Iパラメーターを使用してヘッダーファイルディレクトリ(i)を指定すると、エラーが報告されていることがわかります。
このエラーは、これらがすべてlualibライブラリにあるため、これらのものが見つからなかったことを意味します。検索して指定するだけです。
5. cp / usr / lib / x86_64-linux-gnu / liblua5.3.so.0を直接sudoします。ライブラリをこのディレクトリにコピーしてから、名前をliblua5.3.soに変更します。次にコンパイルします。-lパラメーターを使用してプログラムにリンクするライブラリーを指定します。-lパラメーターの後にライブラリー名(l)を指定します。エラーは報告されません。実行します。結果は次のとおりです
しばらくluaを使っているので、Cとluaのやりとりは難しくないといつも感じていましたが、実際に操作して初めて難しいのか、難しいのかを判断する力があると感じています。そうではありません。今日試してみましたが、それほど難しくはありません。それでも結論を出す前に、自分でできる限り努力する必要があります。「剣も、剣も、概念もありません」