尝试在 iPad 上为 Codea 加载第三方 lua 库
概述
在别人的代码中学到一种方法, 可以通过 require
在 Codea
中直接加载 lua
库, 感觉很实用, 打算尝试着扩展一下, 看看能否加载用 c
编译出来的 .dylib
动态库和 .a
静态库.
加载 .lua 形式库的方式
简单介绍一下 lua
加载库的原理, 所谓的库其实就是一些被组织起来的 lua
代码, 为了方便项目管理, 把 lua
代码以库的形式编写. 那么加载一个库其实就是把这个库的代码执行一遍, 首先得找到这个库, lua
中有个约定, 使用这两个变量来指明库文件的路径:
-
lua库地址
- package.path
-
c 库地址
- package.cpath
有了上述知识背景, 我们就明白在 Codea
中加载库实际上就是指明库文件所在的位置, 假设我们的库文件是 mylib.lua
我们先把库文件放在一个 Codea
能够访问的位置, 比如 Codea
中的 Documents
或 Dropbox
下, 然后再在代码中指定这个位置.
一般而言, 如果是多个库文件, 那么我建议专门建一个目录放在 Dropbox
, 因为它可以在外部批量操作, 如果只是少数几个库文件, 那么可以手动把它们加入 Documents
中.
具体代码如下:
lib = {}
home = os.getEnv("HOME")
lib.Documents = home.."/Documents"
lib.Dropbox = home.."/Dropbox.assats"
package.path = package.path..";"..lib.Dropbox
mt = require "mytest"
mt.foo()
这里可以打印一下, 看看我们的库放在哪里了:
print(package.path)
尝试加载动态库 dylib
接下来试验一下是否可以通过这种方式加载动态库, 如果可以的话就非常强大了, 我们可以把那些计算量较大的模块写成动态库, 再通过 Codea
中的 lua
来调用
先用 c
编译一个测试用的动态库, 代码如下:
#include <stdio.h>
#include "lauxlib.h"
void foo(lua_State* L)
{
puts("Hello, I'm a shared library");
}
编译命令如下:
gcc -c -Wall -Werror -fpic foo.c -I/Users/admin/sourceCode/lua-5.3.3/src
gcc -shared -o libfoo.dylib foo.o
我的环境的 OSX
, 也可以用这个命令来生成库文件, 下面是静态库文件的生成:
libtool -static -o libfoo.a foo.o
接下来就是把生成的库文件 libfoo.dylib
和 libfoo.a
放到 Codea
中, 这次只能放在 Dropbox
中, 因为 Documents
放不进去.
然后执行跟上面类似的一段代码, 不过这次设置的是 package.cpath
, 代码如下:
package.cpath = package.path..";"..lib.Dropbox
mt = require "mytest"
mt.foo()
非常遗憾的是, 运行报错了, 提示信息是:
Dynamic Libraries is not enable
至于 libfoo.a
就不必试了, 因为静态库是在编译时使用的, 而我们的 Codea
处于运行时.
后来查了一下, 发现 iOS
不允许把运行时编译好的代码放进内存执行, 只能以解释方式执行 interpret
.