Lua SWIG 基础
2018-7-3 3:33:10
收藏:0
阅读:129
评论:1
我正在尝试使用以下网址提供的指令实现基本的向量类操作:
http://swig.org/Doc1.3/SWIG.html#SWIG_adding_member_functions
我有下面的.i文件:
%module mymodule
%{
typedef struct
{
float x,y,z;
} Vector3f;
%}
typedef struct
{
float x,y,z;
} Vector3f;
%extend Vector3f {
Vector3f(float x, float y, float z) {
Vector3f *v;
v = (Vector3f *) malloc(sizeof(Vector3f));
v->x = x;
v->y = y;
v->z = z;
return v;
}
~Vector3f() {
free($self);
}
void print() {
printf("Vector [%f, %f, %f]\n", $self->x,$self->y,$self->z);
}
};
现在我的问题是,如果在 Lua 中调用以下代码:
print(mymodule)
local v = Vector(3,4,0)
v.print()
--顺便问一下,在 Lua 中有相当的东西吗?
--del v
我有如下输出:
table: 0x000001F9356B1920
attempt to call global 'Vector' (a nil value)
很明显模块已经正确加载,因为我首先打印了表地址
但我无法创建一个向量... 我还尝试调用模块方法 mymodule:Vector(1,2,3) 仍然会生成一个错误。我错过了什么?
我想要的就是生成一个新的 Vector,并使用 ~Vector3f() 方法销毁它的 GC。我应该修改什么来使这个机制
工作?
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

SWIG 会从析构函数自动生成一个
__gc元方法。原则上,您的类甚至不需要自定义析构函数,缺省的也能正常工作。此外,SWIG 并不需要知道函数的所有实现细节,只需要函数签名即可生成包装器代码。这就是为什么我将
Vector3f结构体移动到了字面量的 C++ 部分(也可以在头文件中),并只重复了函数签名。为了代替
print成员函数,为什么不增加能够与 Lua 的print()函数一起使用的能力呢?只需要编写一个__tostring函数返回对象的字符串表示即可。test.i%module mymodule %{ #include <iostream> struct Vector3f { float x,y,z; Vector3f(float x, float y, float z) : x(x), y(y), z(z) { std::cout << "Constructing vector\n"; } ~Vector3f() { std::cout << "Destroying vector\n"; } }; %} %include <std_string.i> struct Vector3f { Vector3f(float x, float y, float z); ~Vector3f(); }; %extend Vector3f { std::string __tostring() { return std::string{"Vector ["} + std::to_string($self->x) + ", " + std::to_string($self->y) + ", " + std::to_string($self->z) + "]"; } };test.lualocal mymodule = require("mymodule") local v = mymodule.Vector3f(3,4,0) print(v)编译和运行的示例工作流程:
$ swig -lua -c++ test.i $ clang++ -Wall -Wextra -Wpedantic -I/usr/include/lua5.2/ -fPIC -shared test_wrap.cxx -o mymodule.so -llua5.2 $ lua test.lua Constructing vector Vector [3.000000, 4.000000, 0.000000] Destroying vector