`
hzy3774
  • 浏览: 992964 次
  • 性别: 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-nginx-module-0.10.13

    - 可以调用C库,扩展功能边界。 - 良好的错误处理机制和调试工具。 二、Lua-Nginx-Module核心概念 2.1 Lua上下文 在Nginx中,Lua运行在多个上下文中,包括http、server、location、access_by_lua、content_by_lua...

    lua-nginx-module-0.10.9rc7

    2. **编译Nginx**:在编译Nginx时,需要将lua-nginx-module源码路径作为参数传递给`--add-module`选项。同时,确保已经正确配置了ngx_devel_kit的路径。 3. **配置Nginx**:在Nginx的配置文件中,启用lua模块并指定...

    cocos2d-js/lua游戏【解密】套件

    《cocos2d-js/lua游戏解密套件详解》 在移动游戏开发领域,cocos2d-js和cocos2d-lua是常见的游戏引擎,它们为开发者提供了便捷的跨平台开发工具,使得游戏可以在iOS、Android等多个平台上运行。然而,随着游戏市场...

    lua-devel-5.3.4-12.el8.aarch64

    1. **头文件**:例如 `lua.h`、`luac.h` 等,这些头文件定义了 Lua API,供 C/C++ 程序调用 Lua 的函数和结构体,以便在 C 代码中与 Lua 脚本进行交互。 2. **库文件**:`liblua.a` 或 `liblua.so` 是静态和动态...

    luajava-1.1-x64-lua51

    Luajava是连接这两者的桥梁,它实现了Lua与Java的交互,允许Lua代码调用Java方法,同时也让Java程序可以执行Lua脚本。Luajava的核心是它的绑定机制,通过Java Native Interface (JNI) 实现,使得Lua与Java之间可以...

    lua-nginx-module-master.zip

    3. **Lua API**:Nginx-Lua模块提供了丰富的API供开发者调用,包括请求和响应对象、变量、定时器、日志记录、连接池管理等。例如,`ngx.req.get_uri_args()`获取请求的查询参数,`ngx.say()`输出HTTP响应内容,`ngx....

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

    // 处理Lua调用C函数的逻辑 } lua_register(L, "my_c_function", my_c_function); ``` 4. 用`luaL_loadfile(L, "script.lua")`或`luaL_dostring(L, "your_code_string")`加载并执行Lua代码。 5. 调用Lua函数:`lua_...

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

    Java调用Lua脚本是一种常见的跨语言交互技术,特别是在...在Linux环境下,安装和使用LuaJava涉及到编译Lua源码和LuaJava源码,以及配置系统库路径。一旦设置完毕,你就可以在Java应用中自由地利用Lua的强大脚本能力了。

    lua-resty-mongol-master已编译

    《lua-resty-mongol在OpenResty中的应用与集成》 lua-resty-mongol是基于OpenResty的一个lua库,专为处理MongoDB连接和操作而设计。标题"lua-resty-mongol-master已编译"表明我们已经获取到lua-resty-mongol的最新...

    lua5.4.4-msvc.zip

    在编译Lua时,你需要确保设置正确的编译选项,如编译器版本、链接器选项等,以确保与lua54.dll兼容。 总的来说,"lua5.4.4-msvc.zip"提供了在Windows上使用Lua所需的基本工具,适用于开发、调试和运行Lua脚本。无论...

    luajava-x32-x64.zip

    luajava是Lua语言与Java平台的交互库,它允许Lua脚本直接调用Java类和方法,同时也让Java程序能够执行Lua代码,实现了两种语言的无缝集成。这个压缩包"luajava-x32-x64.zip"包含了luajava-1.1.jar的64位和32位版本,...

    Lua与C/C++交互——C/C++调用Lua脚本

    在C/C++程序中,首先需要初始化一个Lua状态机(Lua state),这是执行Lua代码的基础。通过`luaL_newstate()`函数可以创建一个新的Lua状态机,然后使用`luaL_openlibs()`打开标准库,为Lua环境提供基本的函数集。 5...

    Lua5.1.5-lib库

    3. **lapi.c/lapi.o**: 实现了Lua与C之间的接口,包括调用C函数和访问全局变量等功能。 4. **lcode.c/lcode.o**: 编译Lua代码成字节码的模块。 5. **ldebug.c/ldebug.o**: 调试功能相关的实现,如断点、步进等。 6. ...

    centos64位编译luajava1.1

    通过这个过程,你不仅了解了如何在CentOS 64位系统中编译Luajava 1.1,还学习了如何配置环境和使用Luajava调用Java类。这个工具为Lua开发者提供了强大的Java集成能力,使他们能够利用丰富的Java生态资源。

    lua-cjson-2.1.0(VS2013版本编译完整项目)

    4. **在VS2013中编译lua-cjson**: 打开生成的.sln文件,确保你的解决方案配置为“Release”或“Debug”,并选择合适的CPU目标(x86或x64)。然后,点击“Build Solution”进行编译。编译成功后,你会在指定的输出...

    lua-5.1.5-Win64-bin (exe)程序

    3. **bin2c5.1.exe**:这是一个工具,用于将二进制数据(如预编译的Lua字节码)转换成C语言数组,这样就可以直接将它们嵌入到C/C++项目中。这有助于减少最终程序的体积和启动时间,因为不需要在运行时加载和解析Lua...

    lua-5.4.2_Win64_bin.zip

    同时,luac.exe则用于将hello.lua预编译为hello.luac,这样在后续运行时可以提高执行效率: ```shell luac -o hello.luac hello.lua lua hello.luac ``` 总的来说,"lua-5.4.2_Win64_bin.zip" 提供了一套完整的64...

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

    在本文中,我们将深入探讨如何使用Visual Studio 2019编译Lua 5.4.4源码,创建一个C++库,并演示如何在C++项目中正确地加载和调用Lua脚本。Lua是一种轻量级的脚本语言,广泛应用于游戏开发、系统配置、软件扩展等多...

    luajava实例及jar包,dll动态链接库

    luajava-1.1.dll则是LuaJava在Windows操作系统上的实现,它是Java Native Interface (JNI)的一部分,允许Java代码直接调用C/C++编写的原生代码。在LuaJava中,这个dll文件用于实现Lua与Java之间的底层交互,处理如...

    lua源码下载 Lua-5.3.4 源码 最新 截止2017-3-7

    在自行编译Lua源码时,通常需要遵循以下步骤: 1. **配置**:使用`configure`脚本来配置编译选项,如目标平台、C编译器等。 2. **编译**:运行`make`命令来编译源码生成可执行文件和库文件。 3. **测试**:使用`...

Global site tag (gtag.js) - Google Analytics