加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

编译Lua以及编写动态扩展

发布时间:2020-12-14 22:24:59 所属栏目:大数据 来源:网络整理
导读:? 1 ???????? 前言 Lua 基本的编译说明在源代码包里的 INSTALL 文件中已经讲得很清楚,这里重点讲的是如何在 IDE 环境下面编译。 2 ???????? Visual Studio 环境下的编译 创建一个解决方案“ lua ”,其中包含三个项目:两个控制台项目“ lua ”和“ luac ”

?

1???????? 前言

Lua 基本的编译说明在源代码包里的 INSTALL 文件中已经讲得很清楚,这里重点讲的是如何在 IDE 环境下面编译。

2???????? Visual Studio 环境下的编译

创建一个解决方案“ lua ”,其中包含三个项目:两个控制台项目“ lua ”和“ luac ”,一个 dll 项目“ lua51 ”,按照 INSTALL 文件中的方法把源文件加到三个项目中,具体增加哪些文件其实很好记,“ lua51 ”项目去掉“ lua.c ”、“ luac.c ”和“ print.c ”,“ lua ”项目只需要“ lua.c ”,“ luac ”项目需要“ luac.c ”和“ print.c ”。

项目依赖性为:“ lua ”和“ luac ”都依赖于“ lua51 ”。

在三个项目选项中必须加入自定义编译选项“ /DLUA_BUILD_AS_DLL ”!否则编译出来的 DLL 没有任何导出函数(这是因为在“ luaconfig.h ”头文件中,“ LUA_BUILD_AS_DLL ”宏控制了“ __declspec(dllexport) ”和“ __declspec(dllimport) ”的定义, VS 编译器在编译 DLL 时候需要这个定义,而 GCC 不需要)。

使用 VS 编译器,“ luac ”链接会不通过,提示找不到某些函数的定义,这其实是 BUG ,可以使用 SVN 下载最新的 lua 源代码解决,不过使用 GCC 是更好的方法。

3???????? Code::Blocks + GCC MinGW )环境下的编译

上面说到使用 GCC 是更好的方法,另一个原因是可以避免 Visual Studio 不同版本的 God Damned Fucking VC 运行时问题(参见“ http://blog.koroirc.com/2008/06/visual-cpp-woes/ ”,静态连接可以解决这个问题,但是编译出来的文件要大一些,而且想想每一个编译出来的 exe dll 中都塞着同样的代码,就很不爽!)。

CB http://www.codeblocks.org/ )中创建解决方案和项目的方式差不多( CB 中),依赖性可以不用设置,直接调整项目的上下顺序即可( lua51 项目排在最上面),如果要设置依赖性,在任意一个项目的属性中设置:

3 ? 1 CB 中设置项目依赖性

lua51 ”项目属性中,目标文件名要注意改一下,把“ lib ”前缀去掉:

3 ? 2 去掉 DLL 项目目标文件的前缀

lua ”和“ luac ”项目的编译选项种中要加入对 lib 库的链接:

3 ? 3 加入 lua51 的链接库

这样就可以编译了,编译出来的 lua.exe luac.exe lua51.dll 相当小,因为都动态链接到了“ msvcrt.dll ”上,而不是那些恶心的“ msvcrXX.dll ”。

3 ? 4 依赖性

4???????? 编写简单的扩展

参考 http://blog.csdn.net/wzhwkent/archive/2009/07/20/4363367.aspx ,我这里把内容进行了化简。

事实上就是编写一个 lua 能认的 dll ,在 GCC 环境下一切都是那么地简单:需要导出的函数或变量前面加上“ extern ”关键字(不加也可以),不需要导出的,加上“ static ”关键字 - 标准 C 规范!

#include "../src/lua.h"

#include "../src/lualib.h"

#include "../src/lauxlib.h"

#include <math.h>

?

static int l_sin (lua_State *L) {

??? double d = luaL_checknumber(L,1);

??? lua_pushnumber(L,sin(d));

??? return 1; /* number of results */

}

?

static struct luaL_reg lrLibs[] = {

??? { "sin",l_sin

??? },{ NULL,NULL } /* sentinel */

};

?

extern int luaopen_mylib( lua_State* L ) {

??? luaL_register( L,"mylib",lrLibs );

??? return 1;

}

编译出来的 DLL 同样非常小!

4 ? 1 依赖性

4 ? 2 程序大小

写一个简单的 lua 脚本执行一下:

require("mylib");

print(mylib.sin(10));

执行结果:

D:/Lua/Release>lua test.lua

-0.54402111088937

Well done!

5???????? 后记

还是 Linux 下面的那套规则爽,不过按照微软一贯的“简单问题复杂化”的思路,也正常,呵呵

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读