参考了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,编译应该没问题,运行就可以看到结果了: