【发布时间】:2016-08-11 07:17:00
【问题描述】:
我正在创建一个与另一个 C++ 项目的 Lua 绑定。经过一番调查,LuaJIT FFI 似乎是实现这一目标的最佳选择。我真的受益于 lua 用户邮件列表存档 [1] 和另一张相关幻灯片 [2]。实际上,这里已经完成了一个 Hello World 示例 [3],欢迎提出任何改进建议。
目前我正在尝试将shared_ptr 引入此示例,这样我就不需要关心垃圾收集问题。但由于我在 Lua 和 LuaJIT 上的经验不佳,Lua 脚本总是返回 Segmentation fault,我什至不知道如何调试它。下面列出sn-ps的代码,希望各位有识之士能给我一些实用的建议。
这是hello.cpp,我用来创建库的命令是g++ -std=c++11 -shared -fPIC -o libhello.so hello.cpp。
#include<memory>
using namespace std;
class Hello {
public:
const char* World()
{
return "Hello World!\n";
}
};
typedef shared_ptr<Hello> pHello;
extern "C" {
pHello Hello_new(){
return pHello();
}
const char* Hello_World(pHello self){
return self->World();
}
}
这是hello.lua,运行命令为luajit hello.lua。
ffi = require('ffi')
ffi.cdef[[
typedef struct pHello pHello;
pHello Hello_new();
const char* Hello_World(pHello);
]]
hello = ffi.load('hello')
hello_index = {
World = hello.Hello_World
}
hello_mt = ffi.metatype('pHello', {
__index = hello_index
})
Hello = hello.Hello_new
hello = Hello()
io.write(ffi.string(hello:World()))
【问题讨论】:
-
我不知道 LuaJIT 是怎么接受你的 cdef 的;
struct pHello没有定义,所以 LuaJIT 不可能知道它有多大以及Hello_new返回多少字节。在任何情况下,都不要在 C API 中直接公开shared_ptr- 没有好办法让它在 C 中工作。
标签: c++ c++11 binding lua luajit