Lua基础-编译/Lua与C互相调用

首先来windows下编译lua

下载lua源码 http://www.lua.org/ftp/

如果安装了mingw,make.exe所在目录添加到环境变量

命令行进入src目录:

执行 make mingw


Lua基础-编译/Lua与C互相调用
 

生成三个文件,


Lua基础-编译/Lua与C互相调用
 

写一个hello.lua来测试一下:


Lua基础-编译/Lua与C互相调用
 

print('Hello World!!')

双击打开lua.exe

使用命令:dofile('hello.lua')


Lua基础-编译/Lua与C互相调用
 

执行成功

另一个可执行文件luac.exe用于把lua文件编译成用户不可随意修改的代码:

执行如下命令:

luac -o hello.out hello.lua


Lua基础-编译/Lua与C互相调用
 

生成hello.out,该文件同样可以使用lua的dofile执行,但不可以用编辑器查看其源码


Lua基础-编译/Lua与C互相调用
 

有时候我们需要修改lua工程代码:

比如,用Eclipse建工程,使用mingw编译:


Lua基础-编译/Lua与C互相调用
 

把src文件夹复制到工程下,删掉lua.c,luac.c

然后添加自己的源文件:

第一个程序,我们让程序启动就去解析指定的lua文件

 

/*
 * main.c
 *
 *  Created on: 2014-5-15
 *      Author: Hzy
 */

#include <stdlib.h>

#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"

int main (int argc, char **argv) {
	//开启lua状态机
	lua_State* L = luaL_newstate();
	//装载lua库
	luaL_openlibs(L);
	//执行脚本
	luaL_dofile(L, "hello.lua");
	//关闭lua状态机
	lua_close(L);

	getchar();
	return EXIT_SUCCESS;
}

 编译后:

 


Lua基础-编译/Lua与C互相调用
 

 用C/C++调用lua写的函数:

先写一个Lua的函数:

function myAdd(i, j)
	return i + j
end

 实现加法的功能,

C++中调用:

/*
 * main.c
 *
 *  Created on: 2014-5-15
 *      Author: Hzy
 */

#include <stdlib.h>

#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"

lua_State* L = NULL;

int myAdd(int x, int y)
{
	int sum;
	//指定lua里的函数名
	lua_getglobal(L, "myAdd");
	//将参数压栈
	lua_pushnumber(L, x);
	lua_pushnumber(L, y);
	//调用函数,2个输入参数,1个返回值,
	//最后一个参数是出错调用函数
	lua_pcall(L, 2, 1, (int)NULL);
	//获取返回值
	sum = (int)lua_tonumber(L, -1);
	//返回值出栈
	lua_pop(L, 1);
	return sum;
}

int main (int argc, char **argv) {
	//开启lua状态机
	L = luaL_newstate();
	//装载lua库
	luaL_openlibs(L);
	//执行脚本
	luaL_dofile(L, "hello.lua");
	//调用函数
	printf("myAdd result:[%d]\n", myAdd(5, 6));
	system("pause");
	//关闭lua状态机
	lua_close(L);
	return EXIT_SUCCESS;
}

 效果:


Lua基础-编译/Lua与C互相调用
 lua调用C/C++函数:

/*
 * main.c
 *
 *  Created on: 2014-5-15
 *      Author: Hzy
 */

#include <stdlib.h>

#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"

lua_State* L = NULL;

int myAdd(void)
{
	//获取2个参数检查参数是否是number
	int x= luaL_checknumber(L, 1);
	int y= luaL_checknumber(L, 2);
	//c++实际完成的工作
	int c = x + y;
	//计算结果进栈
	lua_pushnumber(L, c);
	//因为要返回一个参数,所以要return 1
	return 1;
}

int main (int argc, char **argv) {
	//开启lua状态机
	L = luaL_newstate();
	//装载lua库
	luaL_openlibs(L);
	//将函数注册到lua
	lua_register(L, "myAdd", myAdd);
	//执行脚本
	luaL_dofile(L, "hello.lua");
	system("pause");
	//关闭lua状态机
	lua_close(L);
	return EXIT_SUCCESS;
}

 lua代码:

print(myAdd(4, 8))

 执行效果:


Lua基础-编译/Lua与C互相调用
 

OK

你可能感兴趣的:(lua)