这有点令人费解,但试试看:
我正在将LUA脚本集成到我的游戏引擎中,我在过去的win32中以优雅的方式完成了这项工作。在win32上我所做的就是将我想要暴露给LUA的所有函数标记为导出函数。然后,为了将它们集成到LUA中,我将解析可执行文件的PE头,解开名称,解析参数等,然后使用我的LUA运行时注册它们。这使我可以避免单独手动注册每个函数,只是为了将它们暴露给LUA。
现在,闪现今天,我正在开发iPhone。我已经查看了一些Unix的东西,并且我已经非常接近采用类似的方法,但是我不确定它是否真的有效。
我对Unix并不完全熟悉,但这是我目前在iPhone上所拥有的:
上述步骤实际上并没有让我到达我想要的地方,但即使这样也行不通。有没有人有经验在Unix上做这类事情?是否有任何标题或功能我可以谷歌让我走上正轨?
感谢;)
答案 0 :(得分:3)
iPhone初始应用程序启动后不支持动态链接。虽然您想要做的事实上并不需要在任何新的应用程序TEXT中进行链接,但是如果发现某些dl *函数的行为不符合预期,我不会感到震惊。
您可能能够编写一些特定于平台的代码,但我建议使用由各种BSD开发的称为链接器集的技术。基本上,您可以注释要执行某些操作的函数(就像您当前将它们标记为导出一样)。通过一些预处理器魔术,它们存储注释,有时在二进制图像中的额外段中,然后具有抓取该数据并枚举其数据的代码。因此,您只需将所需的所有函数添加到链接器集中,然后遍历链接器集并使用lua注册其中的所有函数。
我知道人们已经在Windows和Linux上运行并运行了这些东西,我在Mac OS X和各种* BSD上使用过它。我是FreeBSD linker_set实现的linking,但我没有亲自见过Windows实现。
答案 1 :(得分:0)
您需要将--export-dynamic
传递给链接器(通过-Wl,--export-dynamic
)。
注意:这适用于Linux,但可以作为搜索的起点。
参考文献:
答案 2 :(得分:0)
如果选择静态链接,请将其集成到链接描述文件中。在链接之前,对所有目标文件执行“nm”,提取全局符号,并生成包含所有符号名称到符号值的(最好是有序/散列)映射的C文件:
struct symbol{ char* name; void * value } symbols = [
{"foo", foo},
{"bar", bar},
...
{0,0}};
如果您希望选择所公开的内容,则最简单的方法是实现命名方案,例如:使用Lua _。前缀所有函数/方法。
或者,您可以创建一个简单的宏
#define ForLua(X) X
然后grep ForLua的源代码,选择要合并的符号。
答案 3 :(得分:0)
你可以生成一个mapfile而不是使用它吗?