本文介绍: 我们今天在windows平台编译lua,生成 lua动态库,lua.exe,luac.exe。lua/include 帮助文档 在其他平台使用编译器需要包含的头文件。build.cmd 是编译脚本,在执行前我们需要修改里面的gcc路径。lua/bin/lua54.dll 动态库 lua/doc。lua当配置文件使用的脚本 config.lua。lua/bin/luac.exe 编译器。我使用的是本地安装好的QT5的编译器。ua/bin/lua.exe 解析器。lua函数调用脚本 add.lua。
我们今天在windows平台编译lua,生成 lua动态库,lua.exe,luac.exe
git clone git@gitee.com:jameschenbo/lua_c_application.git
build.cmd 是编译脚本,在执行前我们需要修改里面的gcc路径
点击运行 build.cmd 等待编译结束,生成lua文件夹
lua/doc 帮助文档
lua/include 在其他平台使用lua需要包含的头文件
c_call_main.c
#include "lua/include/lua.h"
#include "lua/include/lualib.h"
#include "lua/include/lauxlib.h"
static int clua_add(lua_State* L, int a, int b)
{
int sum = 0;
/* 函数入栈 */
lua_getglobal(L, "add");
/* 第一个函数参数入栈 */
lua_pushnumber(L, a);
/* 第二个函数参数入栈 */
lua_pushnumber(L, b);
/* 执行函数调用。2表示有两个函数形参,1表示add函数只有一个返回值,调用lua_call函数后lua自动出栈参数和函数,并将函数的执行结果入栈 */
/*
* 执行函数调用
* 2表示lua脚本中add函数需要输入两个函数参数
* 1表示lua脚本中add函数有一个返回值
* 执行完函数调用后,lua自动出栈函数和参数
*/
lua_call(L, 2, 1);
/*
* 得到函数add函数执行结果
* -1表示最后一个返回值,因为lua的函数可以返回多个值的。
*/
sum = lua_tonumber(L, -1);
/* 出栈一个数据。此时栈中存的是add函数的执行结果,所以需要出栈 */
lua_pop(L, 1);
return sum;
}
/**
* 调用lua 函数,传递参数并获取返回值
* lua_script/add.lua
*/
void example_add(void)
{
int sum = 0;
lua_State* L;
L = luaL_newstate(); /* 创建一个句柄 */
luaL_openlibs(L); /* 打开lua库 */
#if 1
if(luaL_dofile(L, "./lua_script/add.lua")) /* 从lua脚本文件 中加载lua脚本语句 */
{
printf(" load lua script file error! rn");
return;
}
#else
if(luaL_dostring(L, (const char *)"function add(a, b) return a + b end")) /* 从字符串中加载lua脚本语句 */
{
printf(" LUA语句有误!rn");
return -1;
}
#endif
sum = clua_add(L, 10, 20);
printf(" sum = %d rn", sum);
lua_close(L); /* 关闭lua,清理内存 */
}
void load_config_file(lua_State* L, const char* fname, int *w, int *h)
{
if(luaL_loadfile(L, fname) || lua_pcall(L, 0, 0,0)) {
printf("load config file errorn");
}
//1.读变量配置
//入栈操作,和出栈操作要对应
lua_getglobal(L, "width");
lua_getglobal(L, "height");
//出栈操作,先压栈的,后出栈
if(!lua_isnumber(L, -2)) {
printf("width should be number!n");
}
if(!lua_isnumber(L, -1)) {
printf("height should be number!n");
}
//转换数据类型
*w = lua_tointeger(L, -2);
*h = lua_tointeger(L, -1);
//清空栈
lua_settop(L, 0);
//2.读 table 配置
lua_getglobal(L, "sys_table_cfg");
//入栈,指定位置
lua_getfield(L, -1, "sex");
lua_getfield(L, -2, "age");
lua_getfield(L, -3, "port");
lua_getfield(L, -4, "baud");
lua_getfield(L, -5, "isSave");
//出栈,和入栈顺序相反
printf("sys_table_cfg:nn");
printf("sex:%sn",lua_tostring(L, -5));
printf("age:%dn",lua_tointeger(L, -4));
printf("port:%sn",lua_tostring(L, -3));
printf("baud:%dn",lua_tointeger(L, -2));
printf("isSave:%dn",lua_tointeger(L, -1));
printf("n");
lua_settop(L, 0);
}
/**
* 读取lua格式的配置文件
* lua_script/config.lua
* 配置文件有全局变量,有表
*/
void example_config_file(void)
{
lua_State *L = luaL_newstate();
luaL_openlibs(L);
int w, h;
load_config_file(L, "./lua_script/config.lua", &w, &h);
printf("width=%d,height=%dn", w, h);
}
int main(int argc, char* argv[])
{
//下面是两个例子选择一个编译执行
//
// example_add(); //调用lua函数例子,传参和接收返回值
example_config_file();//读取lua脚本编写的配置文件例子
getchar();
return 0;
}
--define windows size
print "my application config file (*.lua)!"
width = 100
height = 80
sys_table_cfg = {
sex = "male",
age = 18,
port = "COM1",
baud = 9600,
isSave = 0
}
function add(a, b)
return a + b + 10
end
原文地址:https://blog.csdn.net/bai_yechuang2012/article/details/134642525
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_34256.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。