【问题标题】:Lua segfault when loading dll加载dll时Lua段错误
【发布时间】:2016-10-27 16:34:18
【问题描述】:

我正在尝试为 lua 制作一个 c 扩展 dll。我有这个csin.c:

#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#include <math.h>

static int l_sin(lua_State *L) {
    double d = lua_tonumber(L, 1);
    lua_pushnumber(L, sin(d));
    return 1;
}

int luaopen_csin(lua_State *L) {
    lua_register(L, "csin", l_sin);
    return 0;
}

我正在用gcc -Wall -shared -Ilua-5.3.3/include -Llua-5.3.3/lib csin.c -o csin.dll -llua 编译它。包含目录只有来自 Lua 5.3.3 src 下载的 .h 文件,而 lib 目录有 liblua.a 我用 make generic 编译的。它编译没有错误,但是当我尝试在 Lua 脚本中使用它时,它只会给出一个Segmentation Fault

这里是lcsin.lua

require("csin")
print(csin(45))

我只是用lua lcsin.lualua 作为lua32/lua53.exe 的链接运行它,我想我是从 Lua 的二进制下载中获得的。我也尝试使用编译后的lua-5.3.3/src/lua.exe,但它说:

lua-5.3.3/src/lua: lcsin.lua:1: module 'csin' not found:
        no field package.preload['csin']
        no file '/usr/local/share/lua/5.3/csin.lua'
        no file '/usr/local/share/lua/5.3/csin/init.lua'
        no file '/usr/local/lib/lua/5.3/csin.lua'
        no file '/usr/local/lib/lua/5.3/csin/init.lua'
        no file './csin.lua'
        no file './csin/init.lua'
        no file '/usr/local/lib/lua/5.3/csin.so'
        no file '/usr/local/lib/lua/5.3/loadall.so'
        no file './csin.so'
stack traceback:
        [C]: in function 'require'
        lcsin.lua:1: in main chunk
        [C]: in ?

我认为这个错误是因为编译的不是.dll 文件而是.so 文件。我正在使用cygwin。一段时间以来,Windows/Linux 的不一致一直是一个痛苦的问题。我已经在网上尝试了示例代码,但没有任何效果。

【问题讨论】:

  • 它没有段错误,是吗?
  • 确实有段错误

标签: c dll lua


【解决方案1】:

如果问题确实是搜索.so 文件而不是*.dll 文件,那么通过将适当的模式添加到package.cpath 应该很容易解决:

package.cpath = package.cpath..";./?.dll"
require("csin")

假设csin.dll在当前文件夹中,它应该能够找到并加载它。

【讨论】:

  • 上面写着dynamic libraries not enabled; check your Lua installation。我用make mingw编译了lua.exe
  • 您需要使用MYCFLAGS="-DLUA_USE_DLOPEN" 编译Lua 本身或定义_WIN32,这将打开LUA_DL_DLL。详情请查看luaconf.h
猜你喜欢
  • 2017-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 2018-01-21
  • 1970-01-01
  • 2016-12-13
相关资源
最近更新 更多