在Win7下编译Lua5.2.3

来源:互联网 发布:球球大作战代点软件 编辑:程序博客网 时间:2024/06/05 04:15

参考了http://yizhenfei.is-programmer.com/posts/37578.html

环境

Windows 7
Visual Studio 2008
Lua 5.2.3

 

动机

因为自己比较弱,还不是非常习惯在Vim里看源代码,所以决定还是把阅读Lua源码的事情放在Windows平台上做。Source Insight不错,但是如果可以编译运行自己进行的一些小改动的话,应该能提高自己对代码的理解,因此打算在Visual Studio里读。(其实也有刚刚装了Visual Studio 2013,想尝鲜的缘故。)

官网上对于Windows下编译Lua的指南,最新的也仅是基于Visual Studio 2003了,而且是直接抛出了工程文件,参考意义是有的,但要想拥有灵活性,还是要自己动手,丰衣足食了。

 

建立项目

Lua的源代码编译后会生成三个对象:Lua库、基于该库的独立解释器以及字节码编译器。所以,在solution中,我们也要建立三个project与他们对应。在这里,暂且称整个solution为lua_vs11,三个project分别为lua_lib、lua、luac,类型都可以选择C++的空项目。

还没有读源代码,这里先按照网上的说法对源代码进行分配,lua.c放在lua项目下,luac.c放在luac项目下,其余的全部都是lua库的代码,扔在lua_lib下。

 

生成设置

首先,我们要设置lua以及luac依赖于lua_lib,这样可以保证lua_lib最先进行编译。(项目上右键,“项目依赖项”)

其次,我们要让lua以及luac中包含lua头文件的预处理指令正常得到展开。这里采用比较土的方法,是把lua_lib加入到lua以及luac的预处理器搜索目录中。(项目属性,VC++目录,包含目录)

最后,我们要让lua以及luac能够在链接时正常链接到lua_lib上,这里要做三件事:

1.我们要修改lua_lib项目的生成目标为静态库。(项目属性,常规,配置类型)
2.我们要让lua以及luac链接lua_lib.lib库。(项目属性,链接器,输入,附加依赖项)
3.我们要让lua以及luac搜索lua_lib.lib所在目录(即我们的生成目录),以正确的找到该库。(项目属性,链接器,常规,附加库目录)

生成解决方案即可!

之后把生成的lua_lib.lib,lua.exe,luac.exe放在root目录下,建立一个test工程,把lib包含进来。

写一个test.lua:

     function foo (a)       print("foo", a)       return coroutine.yield(2*a)     end     co = coroutine.create(function (a,b)           print("co-body", a, b)           local r = foo(a+1)           print("co-body", r)           local r, s = coroutine.yield(a+b, a-b)           print("co-body", r, s)           return b, "end"     end)     print("main", coroutine.resume(co, 1, 10))     print("main", coroutine.resume(co, "r"))     print("main", coroutine.resume(co, "x", "y"))     print("main", coroutine.resume(co, "x", "y"))

在test工程里加个cpp写入:

extern "C" {#include "../lua-5.2.3/src/lua.h"#include "../lua-5.2.3/src/lualib.h"#include "../lua-5.2.3/src/lauxlib.h"}int main(int argc, char* argv[]){    lua_State *L = luaL_newstate();    luaL_openlibs(L);    luaL_dofile(L, "test.lua");    lua_close(L);    return 0;}

ok,编译应该没问题,运行就可以看到结果了:





0 0