LUA如何调用C代码
发表于:2025-02-20 作者:千家信息网编辑
千家信息网最后更新 2025年02月20日,这篇文章将为大家详细讲解有关LUA如何调用C代码,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。将C代码编译为DLL文件,让LUA代码调用://mytestlib.c
千家信息网最后更新 2025年02月20日LUA如何调用C代码
这篇文章将为大家详细讲解有关LUA如何调用C代码,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
将C代码编译为DLL文件,让LUA代码调用:
//mytestlib.cpp#include#include #include #include #include //待注册的C函数,该函数的声明形式在上面的例子中已经给出。//需要说明的是,该函数必须以C的形式被导出,因此extern "C"是必须的。//函数代码和上例相同,这里不再赘述。extern "C" int add(lua_State* L) { double op1 = luaL_checknumber(L,1); double op2 = luaL_checknumber(L,2); lua_pushnumber(L,op1 + op2); return 1;}extern "C" int sub(lua_State* L){ double op1 = luaL_checknumber(L,1); double op2 = luaL_checknumber(L,2); lua_pushnumber(L,op1 - op2); return 1;}//luaL_Reg结构体的第一个字段为字符串,在注册时用于通知Lua该函数的名字。//第一个字段为C函数指针。//结构体数组中的最后一个元素的两个字段均为NULL,用于提示Lua注册函数已经到达数组的末尾。static luaL_Reg mylibs[] = { {"add", add}, {"sub", sub}, {NULL, NULL} }; //该C库的唯一入口函数。其函数签名等同于上面的注册函数。见如下几点说明://1. 我们可以将该函数简单的理解为模块的工厂函数。//2. 其函数名必须为luaopen_xxx,其中xxx表示library名称。Lua代码require "xxx"需要与之对应。//3. 在luaL_register的调用中,其第一个字符串参数为模块名"xxx",第二个参数为待注册函数的数组。//4. 需要强调的是,所有需要用到"xxx"的代码,不论C还是Lua,都必须保持一致,这是Lua的约定,// 否则将无法调用。extern "C" __declspec(dllexport)int luaopen_mytestlib(lua_State* L) { const char* libName = "mytestlib"; luaL_register(L,libName,mylibs); return 1;}
以VS 2012为例,介绍编译过程中遇到的小问题解决办法:
1、头文件和库引用设置:
设置上述配置项指向LUA安装目录的inlucde、lib子目录。
然后再设置链接库名,这样就能编译正常了。
2、C代码对应DLL存放路径如果不在LUA默认搜索路径,该如何配置。
通过环境变量LUA_CPATH指定,但是必须是包含文件名的全路径。
补充:Linux下如何通过LUA调用C代码
http://blog.csdn.net/wdlove58/article/details/52191248
我这里是以lua5.1为例
Ubuntu下Lua开发环境安装:
//安装lua运行环境和开发环境sudo apt-get install luasudo apt-get install lua5.1-0-dev
查看库文件安装路径:
locate liblua
编辑mytestlib.c文件
#include#include #include #include int add(lua_State* L) //去掉了原代码中的extern "C",后面也是类似去掉了 { double op1 = luaL_checknumber(L, 1); double op2 = luaL_checknumber(L, 2); lua_pushnumber(L, op1 + op2); return 1; } int sub(lua_State* L) { double op1 = luaL_checknumber(L, 1); double op2 = luaL_checknumber(L, 2); lua_pushnumber(L, op1 - op2); return 1; } //luaL_Reg结构体的第一个字段为字符串,在注册时用于通知Lua该函数的名字。 //第一个字段为C函数指针。 //结构体数组中的最后一个元素的两个字段均为NULL,用于提示Lua注册函数已经到达数组的末尾。 static luaL_Reg mylibs[] ={ {"add", add}, {"sub", sub}, {NULL, NULL} }; //该C库的唯一入口函数。其函数签名等同于上面的注册函数。见如下几点说明: //1. 我们可以将该函数简单的理解为模块的工厂函数。 //2. 其函数名必须为luaopen_xxx,其中xxx表示library名称。Lua代码require "xxx"需要与之对应。 //3. 在luaL_setfuncs的调用中,其第二个参数为待注册函数的数组。 //4. 需要强调的是,所有需要用到"xxx"的代码,不论C还是Lua,都必须保持一致,这是Lua的约定, // 否则将无法调用。 int luaopen_mytestlib(lua_State* L) { const char* libName = "mytestlib"; luaL_register(L, libName, mylibs); //由于在lua-5.3中已没有luaL_register这个函数,所以换成下面两行代码 //lua_newtable(L); //luaL_setfuncs(L, mylibs, 0); return 1; }
编译指令:
gcc mytestlib.c -fPIC -shared -I/usr/include/lua5.1/ -L/usr/lib/x86_64-linux-gnu/ -llua5.1 -o mytestlib.so -Wall
a.lua文件内容如下:
local mylib = require("mytestlib") --对应于teste.c中的包名 print(mylib.add(1.0,2.0)) print(mylib.sub(20.1,19))
执行a.lua结果如下:
xxxx@ubuntu:~/work_space/lua_call_c$ lua a.lua31.1
关于"LUA如何调用C代码"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
函数
代码
字段
数组
文件
环境
结构
路径
参数
字符
字符串
模块
篇文章
面的
编译
一致
两个
元素
入口
内容
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
cmd登录数据库改密码
mysql社区数据库的访问语言
成都 手机软件开发
商业软件开发教程
重庆软件开发高职院校
嵌入式软件开发薪资
云服务器怎么换ip
hp 服务器主板
数据库安全操作论文
民办的计算机软件开发地址
网络安全第三级评测
服务器可以带云终端吗
网络安全险政策
镇江营销软件开发流程
韦忒网络技术服务部
阿里云服务器磁盘快照找不到磁盘
构建网络安全观念的活动形式
互联网时间同步服务器
瀑布流数据库
上海互泊网络技术有限公司如何
现数据库中有三个表
运营数据库
软件开发培训哪家实惠
追踪近期重大网络安全事件
如何成为网络安全的催化剂
辽宁数据网络技术价目表
服务器电源是恒流吗
软件开发生命周期模型的论文
北京erp软件开发询问报价
上海互泊网络技术有限公司如何