第二章从编译开始
首先拿到Lua 5.1.2的源代码,解压缩到C:/Src.不要和我说你的C盘没有空间了;)
这样,在SRC/lua-5.1.2/下面就会出现Lua的源码了。
接下来,我们以右键->编辑打开etc/luavs.bat,这是Lua提供的在VS2003下面编译自身的批处理文件.我们的目标是根据此文件,制作VS2003的工程.
首先,让我们看看这个文件的内容:
cl /MD /O2 /W3 /c /D_CRT_SECURE_NO_DEPRECATE /D_CRT_NONSTDC_NO_DEPRECATE /DLUA_BUILD_AS_DLL l*.c
del lua.obj luac.obj
link /DLL /out:lua51.dll l*.obj
cl /MD /O2 /W3 /c /D_CRT_SECURE_NO_DEPRECATE /D_CRT_NONSTDC_NO_DEPRECATE /DLUA_BUILD_AS_DLL lua.c
link /out:lua.exe lua.obj lua51.lib
cl /MD /O2 /W3 /c /D_CRT_SECURE_NO_DEPRECATE /D_CRT_NONSTDC_NO_DEPRECATE l*.c print.c
del lua.obj linit.obj lbaselib.obj ldblib.obj liolib.obj lmathlib.obj loslib.obj ltablib.obj lstrlib.obj loadlib.obj
link /out:luac.exe *.obj
del *.obj
cd ..
第一行和第二行实际上是把所有的l开头的.c文件编译成了.obj并把lua.c和luac.c编译出来的obj删除.
第三行把生成的obj链接成lua51.dll
据此,我们可以制作Lua的DLL工程了.
首先打开VS2003,新建一个Windows命令行工程Lua51,记得选择是空的工程,工程就放在lua-5.1.2/vc7下面.
添加除了 lua.c luac.c 和print.c以为所有的文件到工程的源文件
接下来,修改新生成的工程的属性:
-
生成 Dll
-
输出目录 ../../bin
-
运行时库 修改为 /MDd 多线程调试 Dll
-
修改高级里面的”编译为”=>编译为C代码 /TC
-
把第一行中三个 /D开头的编译选项添加到 命令行->附加选项里面
-
修改 连接器选项 输出文件名 $(OutDir)/lua51.dll
-
确定,生成项目.
应该可以在 bin 目录下面找到 lua51.dll 和 lua51.lib
至此,我们编译出了嵌入 lua所需要的所有文件.
下面,我们来实验一下,编译出来的文件可不可以使用.
再新建一个一样的工程,名字就叫 lua.
下面是详细步骤:
-
添加 lua.c和lua.h到工程的源文件夹
-
输出目录 ../../bin
-
运行时库 修改为 /MDd 多线程调试 Dll
-
修改高级里面的”编译为”=>编译为C代码 /TC
-
把第四行中三个 /D开头的编译选项添加到 命令行->附加选项里面
-
修改 连接器选项 输出文件名 $(OutDir)/lua.exe
-
确定
-
修改整个解决方案的属性,把启动项设置成lua,在依赖关系中配置 lua依赖于lua51项目.
-
生成lua项目
按下F5 ,如果一切顺利,应该能够看到 Lua的解析器已经以Debug方式启动了.
至此,我们验证了lua51.dll是可以正常工作的.
接下来,还有一个工程,就是 luac.这是一个把lua脚本文件编译成lua字节码的工具.
我们可以按照一下的步骤生成一个luac的工程:
-
新建一个luac的空项目
-
添加除了lua.c意外所有的源文件到项目的源文件夹
-
输出目录 ../../bin
-
运行时库 修改为 /MDd 多线程调试 Dll
-
修改高级里面的”编译为”=>编译为C代码 /TC
-
把 /D_CRT_SECURE_NO_DEPRECATE /D_CRT_NONSTDC_NO_DEPRECATE 编译选项添加到 命令行->附加选项里面
-
修改 连接器选项 输出文件名 $(OutDir)/luac.exe
-
确定
-
生成luac项目
检查:以命令行抵达bin目录,执行 luac,如果看到 Usage 就是编译成功了.