(连载)在 windows 中搭建 lua 应用环境(二)

windows 操作系统下,使用 visaul studio 编译一系列 lua 项目的 c/c++ 源码,需要考虑 2 个问题,一是多个项目存在依赖关系,如何科学组织这些项目才能使项目源码的编译顺利完成,二是如何控制各项目源码的编译输出,使之遵循 lua module 的加载规则,从而正确搭建 lua 应用环境。

  • mingw VS visual studio

mingw + gcc*:在 *windows 操作系统中使用 linuxshell 和编译环境,虽然能方便的使用 makegcc 等命令,但用户在跳出 windows 拥抱 linux 的同时,将面临 linux 下所需要面对的一些问题。除此之外,用户还必须考虑与 windows 操作系统的兼容性问题。mingw 只提供 32 位的运行环境,mingw64 可提供 64 位的运行环境,如果用户需要生成 64 位应用程序,则需要安装 mingw64
*visual studio
:相比之下,*visaul studio
要直接得多,并且是微软官方提供的企业级应用,集成各类工具方便用户使用,唯一的问题是需要用户参照 linux 编译链接过程,对比 visual studio 编译链接器与 gcc 工具链,以及 .dll*、.lib* 与 .o*、.so,建立 *visual studio 工程,并进行合理配置。
微软最新发布的 visual studio 2017 对个人用户免费,以及开源编辑器 visual code*,让笔者对 *visual studio 充满期待,索性就使用纯粹的 windows 吧。

  • lua module 的加载规则

    根据 lua manual:6.3 moduleslua 在特定目录查找 loader*,然后用 *loader 加载 module。其中,lua loader 用于加载 .lua 文件,c loader 用于加载 c 语言编译的动态库。

lua loader 查找范围:环境变量 LUA_PATHLUA_PATH_5_3*,或默认路径(由 *luaconf.h 定义)
c loader 查找范围:环境变量 LUA_CPATHLUA_CPATH_5_3*,或默认路径(由 *luaconf.h 定义)
查看 luaconf.h 可知(在 windows 环境下):
lua 用宏定义了默认搜索路径,假设 lua 执行文件所在目录为 X,则
LUA_CDIR*:辅助宏,为 *X
LUA_LDIR:辅助宏,为 *X\*lua
LUA_VDIR*:辅助宏,当前 *lua 版本号组成的名称,例如 lua 5.35.3
LUA_SHRDIR:辅助宏,为 *X\..\share\lua\*LUA_VDIR
LUA_PATH_DEFAULTlua loader 默认搜索目录,包括 LUA_LDIRLUA_CDIRLUA_SHRDIR 和当前位置 .\
LUA_CPATH_DEFAULTc loader 默认搜索目录,包括 LUA_CDIRX\..\lib\lua\LUA_VDIR 和当前位置 .\
就本人而言,为减少环境变量的使用,各项目输出文件遵循 lua 默认搜索路径规则;为简化配置文件,忽略 lua 版本信息,在配置 c/c++ 源码项目时,重点关注 LUA_LDIRLUA_CDIR 的使用。

.lib 文件供其他 c/c++ 项目在编译时使用,如 luasql-sqlite3 源码编译依赖 sqlite3.lib
.dll 文件在文件执行时使用,如 lua 解释器加载 luasocket 时,相关 .dll 文件必须在规定位置出现
因此,.dll 文件位置应在 LUA_CPATH_DEFAULT 范围内,更确切说,在 LUA_CDIR 范围内

  • visual studio 项目配置要点

visual studio 项目以多个配置文件组织源文件、设置项目的编译环境、以及项目的部署(输出)规则。配置文件的设置以可视化方式进行。

  • 项目组织

visual studio 项目按照 solution/project 的方式组织,即一个 solution (解决方案)包含多个 project (项目)

  • 项目配置宏

    注意与 c/c++ 宏区别。项目配置宏预先定义了一些值,供配置文件使用。如 $(WindowsSDK_IncludePath) 指当前 windows sdk 头文件位置,如 windows.h 所在位置。用 $(…) 符号区分普通值和宏。
    重点关注如下宏定义:

$(Platform):目标平台,如 *x86x64、*arm
$(Configuration):目标配置,如 *debug、*release
$(SolutionDir):解决方案所在路径
*$(SolutionName)
:解决方案名称
$(ProjectDir):项目所在路径
$(ProjectName):项目名称
*visual studio
还支持用户自定义宏,如图所示
p6
p7
p8
多个项目可使用相同的自定义宏,确保多个项目配置的一致性。

  • 项目配置内容

    重点关注如下项目配置内容:
    常规:项目输出目录、目标文件名、目标文件扩展名、配置类型(.exe*、.dll.lib*),如图所示
    p1

c/c++:附加包含目录(include 头文件目录设置)、预处理器(c/c++ 宏的预编译值设置),如图所示
p2
p3
链接器:附加依赖项(依赖的 .lib 文件名列表)、附加库目录(.lib 文件所在目录),如图所示
p4
p5

  • 其他注意事项

    如果编译环境不是 windows 10visual studio 2017,请参考本人的另一篇文章:Visual Studio 2013 编译 c/c++ 问题汇总
    • 结束语

      以上总结了在 windows 中搭建 lua 应用环境所需的知识点和注意事项,以概括的形式回答了文章开头提出的两个问题:c/c++ 项目编译部署方面,注意 visual studio 配置文件的设置,以及 .dll*、.lib* 文件在编译运行中的作用; lua 方面注意默认搜索路径的规则,重点关注 LUA_CDIRLUA_LDIR。下一步将进入项目实施阶段,笔者将给出一个具体综合项目框架。