要开发与 Lua 交互的 C/C++ 程序,则必须有相关的头文件,以及 Lua库。编译 Lua 库可以下载源码进行编译,默认编译出来是静态库,在开发 C/C++ 相关程序时,加链接 -llua 即可。
源码下载:curl -R -O http://www.lua.org/ftp/lua-5.4.4.tar.gz
下载完成后,进行解压,然后就可以进行编译了。首先切换到解压的目录下,输入:make help
看一下支持哪些平台,因为服务器上 centos 的,所以就编译 linux 版本:
很快就能编译出 liblua.a 库,在解压目录src下。如果要把编译好的库和头文件放到系统默认目录下,则 make install 即可。接下来就可以写 c/c++ 代码了,如:
#include <stdio.h>
#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
#include <lauxlib.h>
#include <lua.h>
#include <lualib.h>
}
#endif
int main()
{
lua_State *L = luaL_newstate();
luaL_openlibs(L);
if(luaL_loadfile(L, "init.lua"))
{
printf("load file: hello.lua faild...\n");
lua_close(L);
return 1;
}
lua_pcall(L, 0, 0, 0); /* 前面这几步都基本固定 */
lua_getglobal(L, "COM"); /* 先找到表 */
if(lua_type(L, -1) != LUA_TTABLE)
{
printf("can not find table: COM \n");
lua_close(L);
return 1;
}
lua_pushstring(L, "myAdd"); /* 要找的函数名入栈 */
lua_gettable(L, -2);
if(lua_type(L, -1) != LUA_TFUNCTION) /* 找到的是否是函数 */
{
printf("find myAdd is not a function.\n");
lua_close(L);
return 1;
}
lua_pushnumber(L, 111);
lua_pushnumber(L, 222);
lua_pcall(L, 2, 1, 0); /* 传参, 执行 */
printf("call lua function add() and result: %d\n", (int)lua_tonumber(L, -1));
lua_close(L);
return 0;
}
添加编译选项:-llua,但出现了一个链接问题,显示 lua_xxx 没有实现,如:
一开始以为编译的库有问题,也查看了库里的符号,显示是有这些函数定义的,如用 nm 命令查看结果:
T 则表示定义,而U表示引用。那为何会出现这个错误呢?原因为 这些接口都是纯 C 写的,但我们这个代码是 C++,这样是找不到这些符号的,必须将这些接口添加 extern "C" 声明,告诉编译器这些接口是 C 接口,不能按 C++ 的方式进行查找。所以代码里必须添加如下:
#ifdef __cplusplus
extern "C" {
#include <lauxlib.h>
#include <lua.h>
#include <lualib.h>
}
#endif
添加后就不会再有这些 Lua_xx 找不到的问题了,但出现了另外一个问题:
这些不知道是什么接口,直接 man 看了下,手册里提示需要添加链接:-ldl,编译正常: