【发布时间】:2017-01-16 19:57:26
【问题描述】:
我正在尝试在 Windows 上创建 Lua dll 扩展。我正在使用 Lua 5.3。我的编译器来自 MinGW,是 gcc 4.9.3。
我的 dll 扩展的 C 代码是这样的:
#include <stdio.h>
#include <lua.h>
static int dub(lua_State *L) {
const double a = lua_tonumber(L, 1);
lua_pushnumber(L, a*2);
return 1;
}
__declspec(dllexport) int __cdecl luaopen_mylib(lua_State *L){
printf("One\n");
lua_pushcfunction(L, dub);
printf("Two\n");
lua_setglobal(L, "dub");
printf("Three\n");
return 1;
}
我正在像这样编译我的 dll:
gcc mylib.c -shared -o mylib.dll -llua
我可以从 Lua 加载它并像这样使用它:
require "mylib"
print (dub(5)) --should print 10
但是,当我实际尝试运行 Lua 代码时,它会在 require "mylib" 行崩溃。 DLL 能够打印“一”和“二”,但在崩溃之前无法打印“三”。这告诉我问题可能出在“lua_setglobal”调用上。
怎么了?如何进一步调试或修复它?
作为一个额外的问题:luaopen_mylib 的返回值应该是什么?
谢谢!
【问题讨论】:
-
什么样的崩溃?它会从 Lua 生成堆栈跟踪吗? C 段错误?
-
@Oka 我收到一条 Windows 弹出消息“lua.exe 已停止工作”它有更多详细信息,但对我来说没有任何意义。
-
我不是 Windows 开发人员,但这些细节可能对某些人来说很重要。在寻求帮助时包含错误消息/报告通常是个好主意。
-
你为什么尝试使用 cdecl?你试过 stdcall 了吗?
-
@moteus 我从这里得到了
__cdecl:lua-users.org/wiki/LoadLibrary 将其更改为__stdcall使其显示“找不到指定的过程”。在 'require()' 调用中。