在lua中使用C语言编写的库

Lua 5.3.3 在C语言中写个库 导入到Lua中 阅读详情

因为lua比较小巧所以他本身并没有包含强大的库,但我们可以为lua扩展库,今天主要说明以下怎么在lua中使用C语言编写的库(windows下生成dll,linux下生成so),在库函数中必须包含一个luaopen_yourlibname的函数,库名可以自己定,该函数也是lua_CFunction的类型,主要作用是将你所编写的库中的函数使用lua_register函数将其注册供lua中使用。通过下面的代码可以看到lua的扩展性非常强大。在lua中只需要require "yourlibname"即可或者用loadlib函数.  下面这个例子是为lua提供一个遍历目录的库,

C库代码如下:

#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <string.h>
#include <malloc.h>

#include <lua/lua.h>
#include <lua/lauxlib.h>
#include <lua/lualib.h>

#ifndef MAX_PATH
#define MAX_PATH		260
#endif

enum 
{
	PQFT_UNKNOWN = 0,
	PQFT_FILE = 1,
	PQFT_DIR = 2
};


typedef struct 
{
	DIR	*	dir;
	char 	curr_path[MAX_PATH];
}PQDIR;


static int search_dir_first(lua_State *L)
{
	PQDIR * pd = NULL;
	const char *dir_path = luaL_checkstring(L, 1);

	if ( dir_path ) {
		pd = (PQDIR *)malloc(sizeof(PQDIR));
		if ( pd ) {	
			pd->dir = opendir(dir_path);
			if ( pd->dir ) {
				memset(pd->curr_path, 0, MAX_PATH);				
				memcpy(pd->curr_path, dir_path, strlen(dir_path));
				lua_pushboolean(L, 1);
				lua_pushlightuserdata(L, pd);
				return 2;
			}		
		}	
	}
	
	lua_pushboolean(L, 0);
	lua_pushnil(L);
	return 2;
}

static int search_dir_next(lua_State *L)
{
	char filepath[MAX_PATH];
	struct dirent *ent = NULL;
	struct stat	file_stat;
	PQDIR *pd = (PQDIR *)lua_touserdata(L, 1);
	
	if ( pd ) {
		if ( (ent = readdir(pd->dir)) ) {
			lua_pushboolean(L, 1);
			lua_pushstring(L, ent->d_name);
			sprintf(filepath, "%s/%s", pd->curr_path, ent->d_name);
			lstat(filepath, &file_stat);
			if ( S_ISDIR(file_stat.st_mode) && !S_ISLNK(file_stat.st_mode) ) {
				lua_pushnumber(L, PQFT_DIR);
			} else if ( S_ISREG(file_stat.st_mode) && !S_ISLNK(file_stat.st_mode) ) {
				lua_pushnumber(L, PQFT_FILE);
			} else {
				lua_pushnumber(L, PQFT_UNKNOWN);
			}
			return 3;
		}	
	}

	lua_pushboolean(L, 0);
	lua_pushnil(L);
	lua_pushnil(L);	
	return 3;
}

static int search_dir_finish(lua_State *L)
{
	PQDIR *pd = (PQDIR *)lua_touserdata(L, 1);
	if ( pd ) {
		closedir(pd->dir);
		free(pd);
		pd = NULL;
	}
	return 0;
}

int luaopen_pqdir(lua_State *L)
{
	lua_pushnumber(L, PQFT_UNKNOWN);
	lua_setglobal(L, "PQFT_UNKNOWN");
	lua_pushnumber(L, PQFT_FILE);
	lua_setglobal(L, "PQFT_FILE");
	lua_pushnumber(L, PQFT_DIR);
	lua_setglobal(L, "PQFT_DIR");	

	lua_register(L, "search_dir_first", search_dir_first);
	lua_register(L, "search_dir_next", search_dir_next);
	lua_register(L, "search_dir_finish", search_dir_finish);

	return 0;
}

使用gcc -shared pqdir.c -o pqdir.so -llua -ldl -lm命令将其生存so文件


lua代码如下:

require "pqdir"

function traverse_dir(dirpath)
	print("search: " .. dirpath)
	local bok, dir = search_dir_first(dirpath)
	if bok then
		while true do
			local b, filename, filetype = search_dir_next(dir)
			if b then
				local fullpath = dirpath .. "/" .. filename
				if filetype == PQFT_DIR then
					if filename == "." then
					elseif filename == ".." then
					else traverse_dir(fullpath)
					end
				else
					print(fullpath)
				end 
			else
				break		
			end
		end
		search_dir_finish(dir)
	end
end

traverse_dir("/usr")


Lua与C语言的集成:Lua调用C库编程 Lua是一种轻量级的脚本语言,而C语言则是一种高级的编程语言。本文将介绍如何在Lua中调用C库,以扩展Lua的功能并提高性能。通过以上步骤,我们可以在Lua中调用C库,从而获得C语言的强大功能和性能优势。需要注意的是,加载C库的方式可能因操作系统和Lua版本而异。该函数从Lua栈中读取两个参数,并将它们相加,然后将结果压入栈中。在上面的代码中,我们包含了一些Lua的头文件,并定义了一个名为。函数用于创建Lua模块,将C函数注册为模块的成员。,并且位于Lua的模块搜索路径中。在本例中,我们调用了。 阅读详情

相关推荐

Lua与C语言混合编程:Lua调用C库编程

总结起来,通过Lua调用C库进行编程可以使我们在Lua脚本中利用C语言的高性能和底层操作。在软件开发中,有时候需要在Lua脚本中使用C语言编写的库函数来提供更高效的计算和底层操作。Lua提供了强大的扩展能力,可以通过调用C库函数来扩展Lua的功能。首先,我们需要编写一个C语言库,其中包含我们希望在Lua中调用的函数。现在,我们可以运行Lua脚本并调用C库中的函数了。的结构体数组,其中包含了我们要在Lua中调用的函数。这表明Lua成功调用了C库中的函数,并正确地计算了两个整数的和。在上面的代码中,我们使用。

PixelCoder的博客 379

Lua嵌入c入门

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34384915的博客 776

汽车以太网- IEEE 802.3标准

关于汽车以太网,大家看到最多的标准大概就是IEEE802.3bw,也就是我们车内使用的百兆以太网,专业称呼是100BASE-T1,该标准是车内百兆以太网的物理层协议,是我们学习汽车以太网必须要了解的协议。在正式了解协议之前,我们先介绍下什么是IEEE802.3标准。............

weixin_39974126的博客 7108

Lua与C语言的互相调用

Lua底层是C语言开发的,在设计时就考虑到了与C语言的互操作性。可以把Lua作为一种独立的语言或者作为一种嵌入式的脚本语言。有许多游戏和其他应用程序利用Lua作为脚本语言。 在本文中,我们将重点探讨如何将Lua嵌入到C或C++应用程序中,作为胶水脚本存在。虽然此文只关注C语言的API,但在LuaDardo项目中,这些C API并没有做根本改变,只是在命名规范上做了适应Dart语言的变化(驼峰命名法)。简单说,LuaDardo基本是兼容这些API的。 使用 C API Lua的C语言API是高效和轻量级的。在

编程之路的专栏 7725

IDEA中Maven工具栏与命令执行全攻略:高效开发必备技巧

IntelliJ IDEA 作为强大的 Java 开发工具,其 Maven 功能独具优势。Maven 工具栏位于工作区右侧,图标功能丰富,涵盖项目导入、源码处理、依赖操作等。执行 Maven 命令有多种途径,Run Anything 窗口可输入或选目标执行,上下文菜单能右键运行目标,还可创建运行配置,指定命令参数后运行,为开发者高效管理 Maven 项目、便捷执行命令提供有力支持。

2301_82300081的博客 2030

Power Automate实战:用SharePoint REST API批量处理列表数据(附JSON解析技巧)

本文深入探讨了如何利用Power Automate调用SharePoint REST API实现列表数据的批量自动化处理。文章详细解析了API的协同工作原理、高效的数据获取与筛选技巧,并重点分享了JSON数据解析的核心难点与实战解决方案,旨在帮助企业用户构建稳定可靠的数据处理流程,提升运营效率。

coffee的博客 769

C语言嵌入Lua解释器的方法

Lua语言是一个轻量的脚本语言,可以用很少的资源运行其解释器C语言是一个很常用的语言,广泛用于嵌入式等底层场景这两个语言结合,可以应用于嵌入式等多个场景。比如,一些硬件公司会允许开发者使用Lua语言操作其硬件。

wozuishuai_的博客 1448

ABP框架实战:从零搭建多租户应用(含完整代码示例)

本文详细介绍了如何使用ABP框架从零构建多租户SaaS应用,涵盖多租户架构设计、数据隔离实现、租户管理及性能优化等核心内容。通过完整的代码示例,帮助开发者快速掌握企业级数据隔离系统的开发技巧,提升SaaS应用开发效率。

weixin_29247219的博客 263

用c语言加载lua文件,Lua中脚本中加载C语言的.SO共享库

Lua中脚本中加载C语言的.SO共享库作者:糖果在Lua中,可以使用loadlib的方式直接的加载C语言写的库,如同加载.lua文件一样。C写的模块可以做一些对效率要求相对比较高的模块,或是一些底层操作。下面举例说明:第一步:创建C模块文件。foo.h头文件#ifndef foo_h__#define foot_h__extern void foo(lua_State* L);#endiffoo....

weixin_39552768的博客 860

❤️爆肝十二万字《python从零到精通教程》,从零教你变大佬❤️(建议收藏)

文章目录强烈推荐系列教程,建议学起来!!一.pycharm下载安装二.python下载安装三.pycharm上配置python四.配置镜像源让你下载嗖嗖的快4.1pycharm内部配置4.2手动添加镜像源4.3永久配置镜像源五.插件安装(比如汉化?)5.1自动补码神器第一款5.2汉化pycharm5.3其它插件六.美女背景七.自定义脚本开头八、这个前言一定要看九、python入门十、python缩进十一、Python注释1.单行注释2.多行注释十二、Python 变量1.变量定义理解2. 变量名命名3. 分

全栈川川 26万+

手把手带你实现DAF-Net:零代码基础入门红外与可见光图像融合(从理论到实战)

本文介绍了红外与可见光图像融合技术及DAF-Net网络的应用。红外图像能捕捉热源但缺乏细节,可见光图像纹理丰富但在低光环境下表现不佳。DAF-Net采用双分支特征提取和动态注意力融合架构,能智能分配特征权重实现优势互补。文章详细讲解了环境配置、数据集准备(如TNO数据集)和预处理方法,并提供了DAF-Net的核心代码实现,包括特征提取、注意力融合和图像重建模块。通过该技术可在安防、自动驾驶等领域获得更优质的融合图像,提升视觉感知能力。

m0_71589036的博客 229

Lua如何调用C程序库

注意,我们在这里假设C库被加载到名为mylib的表中,并且add函数在该表中。在实践中,C库可能以不同的方式提供其函数,具体取决于库的创建方式。例如,我们可能需要首先获取一个指向库的指针,然后通过这个指针来访问库中的函数。然后,在Lua中加载并使用这个C库,我们需要首先在Lua中打开这个库。首先,让我们创建一个C库。在Lua中加载和使用C库需要使用Lua的C API。然后,我们需要编译这个库。这将产生一个名为“libmylib.a”的静态库。

最后一个bug的博客 1795

YOLOv11改进策略【Head】| AFPN渐进式自适应特征金字塔,增加针对小目标的检测头(附模块详解和完整配置步骤)

一、本文介绍 本文利用AFPN对YOLOv11的网络模型进行优化提升。AFPN采用渐近式融合及自适应空间融合操作。通过渐近式架构,逐步整合不同层级特征,有效避免非相邻层级间因语义差距过大导致的信息丢失或降级问题,确保在多尺度特征融合过程中既能保留高层语义信息,又能融入低层细节特征。本文将AFPN应用于YOLOv11中,并配置了针对小目标的检测头,能显著增强模型对不同尺度目标的检测能力,使其在复杂场景下更聚焦于目标物体特征,减少背景等无关信息的影响。 专栏目录:YOLOv11改进目录一览 | 涉及卷积层、

Limiiiing的博客 2718

使用C语言构建Lua库

Lua 本身是用 C 语言编写的,因此使用 C 编写扩展可以更好地与 Lua 引擎集成,减少性能瓶颈,同时C 语言提供了对底层硬件和操作系统功能的直接访问能力,让 Lua 可以通过 C 扩展来实现对文件系统、网络等高级功能的支持。因为C 语言非常适合模块化编程,可以很容易地将复杂的 Lua 功能拆分成多个模块或库。

m0_73500130的博客 1034

zynq的irq_f2p 如何增加或修改中断引脚个数(宽度)

ZYNQ开发过程中,如果使用PL到PS的中断,会产生一个疑问,设置界面显示可以有[91:84]、[68:61]共16个中断引脚,但是并没有设置中断口的宽度,如果使用多个中断引脚,应该怎么办?如果通过concat连接多个引脚,则自动调整为对应的引脚数。例如连接3个中断信号,则自动调整为:IRQ_F2P[2:0]

FPGA艺术家的博客 836

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

LUA语言与西门子PLC通过S7通信交互数据(二、自制lua协议库即lua与C语言交互)

衔接上篇,本文分为几个内容: 1、使用VS新建一个动态链接库。 2、移植lua协议库。 3、在协议库内编写Add(加法函数)并验证,这实验用来说明lua与C如何直接进行变量交互。 4、在协议库内编写byte解析成位函数并验证,这实验用来说明lua与C如何通过数组进行交互。 5、在协议库内编写lua协议栈打印函数,方便对协议库的调试。 以下具体说明如何操作: 一、使用VS新建一个动态链接库 操作步骤1:文件----新建项目,项目名称为testlua 操作步骤2: 操作步骤3: 操作步骤4: 操作步骤5

sko1234的博客 1118

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

lua库之注册C语言函数

lua库之注册C语言函数 如何在lua中调用c函数?

gxw1994的博客 1596

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

从C到Lua:ANSI C JSON库的跨语言调用实战指南

你是否在Lua项目中遇到过JSON解析性能瓶颈?是否因C语言的高效与Lua的灵活难以兼得而困扰?本文将带你实现cJSON与Lua的无缝对接,用200行代码解决跨语言数据交互难题,让嵌入式设备的JSON处理速度提升300%。 读完本文你将掌握: - cJSON核心API的零门槛使用方法 - Lua C API实现数据类型转换的技巧 - 跨语言内存管理的避坑指南 - 实测可用的绑定代码与性能优化方案...

gitblog_01096的博客 421

c语言又怎样调用这个so文件,LUA调用C语言实现的SO库

LUA调用C语言实现的SO库作者:糖果这篇文章归纳lua5.1的C语言模库so的“标准”写法,代码都是编译通过的,可直接参考使用!tangguo.h#ifndef __tangguo_h__#define __tangguo_h__#include "lauxlib.h"#include "lua.h"#include "lualib.h"#include "lauxlib.h"extern in...

weixin_32562455的博客 639

c语言的lua库编写

gcc编译 gcc -I/usr/local/include/ -L/usr/local/lib/ -lm -o engine_mlisten_lua ./src/engine_mlisten_lua.c-levent -lpthread -ldl /usr/local/lib/liblua.a Lua可以调用C函数的能力将极大的提高Lua的可扩展性和可用性。对于有些和操作系统相关的功...

weixin_34250709的博客 123

推荐开源项目:lua-resty-json——高效Lua和C语言的JSON库

推荐开源项目:lua-resty-json——高效Lua和C语言的JSON库 lua-resty-jsonjson lib for lua and C项目地址:https://gitcode.com/gh_mirrors/lu/lua-resty-json 1、项目介绍 lua-resty-json是一个专为Lua和C设计的JSON库,提供了高效的解析器和易于使用的接口。这个库的C接口定义在lj...

gitblog_00036的博客 566

用c语言加载lua文件,Lua5.1 C库下载编译使用 + C语言编写的简单Lua 解释器

1、编译Lua下载到Lua的源代码以后,解压缩,里面会有4个文件夹外加一堆文件。其中src文件夹里面就是我们要用到的。打开VS2003或者VS2005,新建一个空的Win32控制台应用程序,注意要是空的哦。这里假设该工程的目录在D:/lua。将刚才的src里的所有.h和.c文件拷贝到工程根目录下,也就是D:/lua下面。在VS中的“解决方案”视图中,右键点击“头文件”,添加现有项,将刚才拷贝过来的...

weixin_28788181的博客 344

c语言lua解释器,Lua5.1 C库下载编译使用 + C语言编写的简单Lua 解释器

1、编译Lua下载到Lua的源代码以后,解压缩,里面会有4个文件夹外加一堆文件。其中src文件夹里面就是我们要用到的。打开VS2003或者VS2005,新建一个空的Win32控制台应用程序,注意要是空的哦。这里假设该工程的目录在D:/lua。将刚才的src里的所有.h和.c文件拷贝到工程根目录下,也就是D:/lua下面。在VS中的“解决方案”视图中,右键点击“头文件”,添加现有项,将刚才拷贝过来的...

weixin_29734123的博客 746

Lua5.1 C库下载编译使用 + C语言编写的简单Lua 解释器

1、编译Lua下载到Lua的源代码以后,解压缩,里面会有4个文件夹外加一堆文件。其中src文件夹里面就是我们要用到的。打开VS2003或者VS2005,新建一个空的Win32控制台应用程序,注意要是空的哦。这里假设该工程的目录在D:/lua。将刚才的src里的所有.h和.c文件拷贝到工程根目录下,也就是D:/lua下面。在VS中的“解决方案”视图中,右键点击“头文件”,添加现有项,将刚才拷贝过来的

1450

Lua进阶用法之Lua和C的接口设计

本篇主要讲解Lua和C之间相互调用的接口设计

记录一位C++爱好者的笔记 2014
上一篇: C语言实现HTTP下载
下一篇: 在OpenGL中使用FreeImage库生成纹理
YellowBug
博客等级 码龄18年 6粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值