从LuaJIT调用C++ DLL
2014-5-29 18:43:4
收藏:0
阅读:132
评论:2
我知道我不能使用 FFI 加载 C++ DLL(只有 C 可以工作),那么我该如何做到这一点?如果我需要使用包装器,我该如何开始?
编辑:我不能以任何方式更改 DLL。
点赞
用户646619
你可以尝试在 FFI cdefs 中手动混淆名称,但是不同的编译器使用不同的名称混淆方案,更不用说引用这些函数会很麻烦。
与其在 cdef 中手动混淆名称,我建议编写一些 C 的包装器。虽然有点繁琐,但并不太难。它的关键在于 C 端将类视为不透明的结构体,传递给包装器函数。查看此网站以获取更多详细信息和注意事项。
以下是我用于 Box2D 的包装器的示例片段:
#include <Box2D/Box2D.h>
#ifdef __linux__
#define CEXPORT extern "C"
#else
#define CEXPORT extern "C" __declspec(dllexport)
#endif
// ///////////////////////////////////////////////////////
// World
CEXPORT b2World* b2World_new(b2Vec2* gravity) {
return new b2World(*gravity);
}
CEXPORT void b2World_destroy(b2World* world) {
delete world;
}
CEXPORT b2Body* b2World_createBody(b2World* world, const b2BodyDef* def) {
return world->CreateBody(def);
}
CEXPORT void b2World_destroyBody(b2World* world, b2Body* body) {
world->DestroyBody(body);
}
CEXPORT void b2World_step(b2World* world, float32 timeStep, int32 velIters, int32 posIters) {
world->Step(timeStep, velIters, posIters);
}
CEXPORT b2Body* b2World_getBodyList(b2World* world) {
return world->GetBodyList();
}
以及相应的 cdecl:
typedef struct b2World b2World;
b2World* b2World_new(b2Vec2*);
void b2World_destroy(b2World*);
b2Body* b2World_createBody(b2World*, const b2BodyDef*);
void b2World_destroyBody(b2World*, b2Body* body);
void b2World_step(b2World*, float, int32_t, int32_t);
b2Body* b2World_getBodyList(b2World*);
2014-05-30 01:55:18
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的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 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
你可以使用一个C++ DLL。你需要这样导出函数(在MSVC中):
extern "C" __declspec(dllexport)由于C++的名称重载机制(名称修饰),你的函数签名将不同于C的命名。例如,这个函数:
int foo(char* a, int b, double c)可能会被导出为像
foo@12abunchoflettershere这样的东西,使用C++命名,而不是像C的命名那样被导出为foo。请注意,
extern "C"并不意味着你的代码是纯C。你仍然可以正常地使用C++。这是有效的:extern "C" __declspec(dllexport) void foo(char *a, int b, std::shared_ptr<Foo> ptr)