我试图为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
进行编译。 include dir只有Lua 5.3.3 src下载的.h
文件,lib目录有liblua.a
,我用make generic
编译。它编译时没有错误,但是当我尝试在Lua脚本中使用它时,它只提供Segmentation Fault
。
以下是lcsin.lua
:
require("csin")
print(csin(45))
我只是使用lua lcsin.lua
运行它,lua
是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的不一致现在已经很长一段时间了。我已经尝试过在线示例代码,但没有任何作用。
答案 0 :(得分:2)
如果问题确实在于搜索.so
个文件而不是*.dll
个文件,那么通过向package.cpath
添加适当的模式应该很容易解决:
package.cpath = package.cpath..";./?.dll"
require("csin")
假设csin.dll
位于当前文件夹中,它应该能够找到并加载它。