编译Lua以及编写动态扩展
来源:互联网 发布:pp助手mac版 编辑:程序博客网 时间:2024/06/05 21:05
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) {
doubled = luaL_checknumber(L, 1);
lua_pushnumber(L, sin(d));
return1; /* 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 );
return1;
}
编译出来的DLL同样非常小!
图 4‑1 依赖性
图 4‑2 程序大小
写一个简单的lua脚本执行一下:
require("mylib");
print(mylib.sin(10));
执行结果:
D:/Lua/Release>lua test.lua
-0.54402111088937
Well done!
5 后记
还是Linux下面的那套规则爽,不过按照微软一贯的“简单问题复杂化”的思路,也正常,呵呵
- 编译Lua以及编写动态扩展
- 编译Lua以及编写动态扩展
- 编译Lua以及编写动态扩展
- 用apache的动态so模式编写和编译php扩展
- 用apache的动态so模式编写和编译php扩展
- 用apache的动态so模式编写和编译php扩展
- 如何编写Lua扩展库 之编写原则
- xcode下lua扩展库的编译
- 【Programming In Lua (2E) 笔记】5:使用C++为Lua编写扩展库(macOS上两种动态库格式的坑)
- 通过编译luaSQL调用ODBC连接Access以及给OpenResty(LuaJIT)编写简单的C扩展示例
- 手动使用C/C++编写Lua扩展插件
- 手动使用C/C++编写Lua扩展插件
- Linux中源码编译lua动态库
- 编译lua,以及c和lua交叉使用
- Lua扩展
- SDL以及扩展库的交叉编译
- 数据库连接的扩展以及动态切换
- soap扩展编译,加载及动态加载
- Lucene 的Query Parser(查询语法)
- 开发高性能的 ASP.NET 应用程序
- LVS源码分析小插曲一---谁在抢谁的饭碗
- apt-get 和dpkg命令大全
- My first blog day
- 编译Lua以及编写动态扩展
- http meta介绍
- 监视 ASP.NET 应用程序性能
- CPM、cpa、cps、PV、IP、UV术语介绍
- Guide to installing 3rd party JARs
- Log4j使用总结
- 漂亮的导航
- 在文档中嵌入对话框,在style 中记得要选child
- for循环效率问题整理