我先下载lua-5.3.5,然后将源放在我的工作目录中,然后使用]进行编译>
make linux
所以我在./lua-5.3.5/src中获得了liblua.a和lua二进制文件。
然后我像这样编写一个C动态库:
#include <stdio.h> #include <math.h> #include <stdarg.h> #include <stdlib.h> #include "lua.h" #include "lauxlib.h" #include "lualib.h" static int l_sin(lua_State *L) { double d = luaL_checknumber(L, 1); lua_pushnumber(L, sin(d)); /* push result */ return 1; /* number of results */ } static const struct luaL_Reg mylib[] = { {"mysin", l_sin}, {NULL, NULL} }; extern int luaopen_mylib(lua_State* L) { luaL_newlib(L, mylib); return 1; }
我用命令编译:
gcc mylib.c -I ./lua-5.3.5/src -fPIC -shared -o mylib.so -Wall
如果我使用原始的lua二进制文件,则可以加载
user00:lua/ $ ./lua-5.3.5/src/lua Lua 5.3.5 Copyright (C) 1994-2018 Lua.org, PUC-Rio > require 'mylib' table: 0xd13170 >
但是如果我编写一个与liblua.a链接的C程序,它将无法加载动态库。
#include <stdio.h> #include <string.h> #include "lua.h" #include "lauxlib.h" #include "lualib.h" int main(void){ char buff[256]; int error; lua_State *L = luaL_newstate(); luaL_openlibs(L); while(fgets(buff, sizeof(buff), stdin) != NULL) { error = luaL_loadbuffer(L, buff, strlen(buff), "line") || lua_pcall(L, 0, 0 , 0); if(error) { fprintf(stderr, "%s", lua_tostring(L, -1)); lua_pop(L, 1); } } lua_close(L); return 0; }
编译:
gcc test01.c -L ./lua-5.3.5/src/ -llua -lstdc++ -o test01 -lm -ldl -I ./lua-5.3.5/src
运行:
user00:lua/ $ ./test01
require 'mylib'
error loading module 'mylib' from file './mylib.so':
./mylib.so: undefined symbol: luaL_setfuncs
我首先下载lua-5.3.5,并将源放在我的工作目录中,并使用make linux进行编译,因此我在./lua-5.3.5/src中获得了liblua.a和lua二进制文件。然后我写了一个C Dynamic ...
您需要从可执行文件中导出Lua API函数。为此,请像Lua发行版中的Makefile一样,将其与-Wl,-E链接。