`
hzy3774
  • 浏览: 984853 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

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

 
阅读更多

首先来windows下编译lua

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

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

命令行进入src目录:

执行 make mingw



 

生成三个文件,



 

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



 

print('Hello World!!')

双击打开lua.exe

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



 

执行成功

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

执行如下命令:

luac -o hello.out hello.lua



 

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



 

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

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



 

把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;
}

 编译后:

 



 

 用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调用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))

 执行效果:



 

OK

  • 大小: 251.5 KB
  • 大小: 67 KB
  • 大小: 16.9 KB
  • 大小: 62.7 KB
  • 大小: 109.4 KB
  • 大小: 34.1 KB
  • 大小: 147.5 KB
  • 大小: 39.9 KB
  • 大小: 48.7 KB
  • 大小: 49.3 KB
分享到:
评论

相关推荐

    lua-cURL访问http/https

    这是编译好的dll(带demo),cURL比luacurl功能强大的多,项目源码及使用: https://github.com/Lua-cURL/Lua-cURLv3

    linux环境中c++调用lua动态链接库以及编译方法

    lua动态链接库的编译 c++调用lua的的方法 linux中调用lua的环境配置

    lua5.4.4官网源码编译C++库

    vs2019编译lua脚本C++库,可正常加载调用lua,lua5.4.4最新版本。里面包含了调用demo

    易语言LUA支持库1.0#0版(第三方)

    这是一组全局函数,当您在您的应用程序中实现一个能被LUA调用的函数时候,需要用到这些函数。主要是数据交换相关。包含 LUA取参数数目、LUA取参数类型、LUA取参数值、LUA加返回值、LUA扩展栈。后续版本可能会根据...

    LuaForWindows_v5.1.5-52 安装包

    Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,Ini等文件格式,并且更容易理解和维护。 Lua由...

    LuaBitOp-1.0.2 lua位操作源码

    lua 位操作源码 ,里面包含doc文档,可以自行makefile 编译成dll来调用

    lua-resty-template:用于Lua和OpenResty的模板引擎(HTML)

    (1)编译意味着将模板转换为您可能会调用或调用的Lua函数或将string.dump作为二进制字节码blob string.dump到磁盘,以便以后与lua-resty-template或基本的load和loadfile标准Lua函数一起使用(请参阅以及)。...

    lua-5.3.5:Lua-5.3.5版官方

    本工程是Lua必然C扩展的内置工程,用于运行调试 所有Lua源码来自lua官方网站[ ] 增加了二进制注释,扩展了一些功能,支持Debug / Release编译模式 整个工程PC端编译整合采用cmake来管理,支持跨平台(可以在树莓派上...

    Cpp中调用Lua,lua中使用cpp注册方法

    cpp中调用lua, 和注册方法到lua中, 及lua中调用cpp的类方法等, 库路径 -https://github.com/radiotail/eluna

    LUA调用C++类

    实现LUA中调用C++类,并对其封装, LINUX下编译

    tolua++ 版helloworld (lua脚本调用C++类的成员函数方法)

    2.配置项目编译环境,把lua和tolua++类库和搜索路径包括进项目来。 2.双击build_pgk.bat 会新生成lua_hello.h调用文件。 3.运行编译即可看到我们的tolua++版的Hello world.这个程序实现了脚本调用C++类的成员函数...

    Lua 5.3.0源码——包含VS2012项目文件

    Lua 5.3.0源码,其中带VS2012的解决方案和项目文件。...但是,Lua5.3.0的编译器luac.c中调用了非Lua Dll导出的函数和数据结构,所以Lua编译器只能编译成链接静态库。Lua解释器则没有这个问题,可以链接静态和动态库。

    Lua 5.2.2源码——包含VS2012项目文件

    Lua 5.2.2源码,其中带VS2012的解决方案和项目文件。...但是,Lua5.2.2的编译器luac.c中调用了非Lua Dll导出的函数和数据结构,所以Lua编译器只能编译成链接静态库。Lua解释器则没有这个问题,可以链接静态和动态库。

    quick-cocos2dx用lua调用自定义c++

    quick-cocos2dx 用lua调用自定义c++类,教程非常详细有截图。本来经过整整一天,最后通过一位网友的远程才搞定的。

    Windows下使用mingw编译实现c程序调用lua脚本测试代码源码

    windows下使用mingw的gcc编译工具,使用测试代码实现使用c调用lua脚本,包括传入参数和返回值的模式和无参数传递的模式的具体实现。

    lua通过so调用C++类

    将C++类导出为.so,并提供给lua调用

    C语言与Lua之间的相互调用详解

    前言 第一次接触Lua是因为Unity游戏中需要...在lua中调用C函数可以提高程序的运行效率。lua与C的相互调用在工程中相当实用,本文就来讲解lua与C相互调用的方法。这次打算好好了解一下C跟lua是如何交互的 那么如何使用L

    c++与lua相互调用编程实例(vs2012 win32工程)

    c++与lua相互调用编程实例(vs2012 win32工程). 载入项目后,请重新编译一下lua源码项目。 参考 ... Cpp_lua_call项目应该放lua源码,cpp_call_lua项目放的是c++和lua调用代码。

    Java调用Lua脚本(LuaJava使用、安装及Linux安装编译)

    NULL 博文链接:https://chamcon.iteye.com/blog/1972995

Global site tag (gtag.js) - Google Analytics