继续lua,
今天要用lpeg(Peg 的lua实现),写了个demo,打算跑一下官方文档的例子,
1. 下载了lpeg的源代码,只有一个c文件和一个makefile,于是make一下,不用install。
2.lua调用c函数时,只要将这些c函数封装成一个动态链接库,so/dll,然后在lua文件中直接require(除so后的文件名)即可(当然c文件还是要添加一些处理)
比如require "lpeg"
还有今天遇到了一个小问题,require时出现too many c levels的错误。原来是我的lua文件(lpeg.lua)与so文件(lpeg.so)文件名对于lua来说是相同的,而require时lua文件的优先级更高,因此就会出现一个自己require自己,出现无穷递归定义的问题。
看看lua require库时文件引用的规则:lua可以在lua文件中require一个本来不存在的库 ,如require"lpeg1",打印出来的错误:
lua: testlpeg.lua:1: module 'lpeg1' not found:
no field package.preload['lpeg1']
no file '/usr/local/share/lua/5.2/lpeg1.lua'
no file '/usr/local/share/lua/5.2/lpeg1/init.lua'
no file '/usr/local/lib/lua/5.2/lpeg1.lua'
no file '/usr/local/lib/lua/5.2/lpeg1/init.lua'
no file './lpeg1.lua'
no file '/usr/local/lib/lua/5.2/lpeg1.so'
no file '/usr/local/lib/lua/5.2/loadall.so'
no file './lpeg1.so'
可见规则:
1. 先遍历所有可能的lua文件:当前目录,还有几个linux库目录
2. 再遍历so文件:先是linux库目录,然后才是当前目录(为什么???)
另外,今天还发现一个问题:我是先用apt安装了lua5.1再用源代码安装了5.2,用脚本方式(#! /usr/bin/env lua)启动时是用5.1,但用lua命令启动时是5.2,待解决!