在 windows 操作系统下,使用 visaul studio 编译一系列 lua 项目的 c/c++ 源码,需要考虑 2 个问题,一是多个项目存在依赖关系,如何科学组织这些项目才能使项目源码的编译顺利完成,二是如何控制各项目源码的编译输出,使之遵循 lua module 的加载规则,从而正确搭建 lua 应用环境。
mingw + gcc*:在 *windows 操作系统中使用 linux 的 shell 和编译环境,虽然能方便的使用 make
、gcc
等命令,但用户在跳出 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 modules,lua 在特定目录查找 loader*,然后用 *loader 加载 module。其中,lua loader 用于加载 .lua 文件,c loader 用于加载 c 语言编译的动态库。
lua loader 查找范围:环境变量 LUA_PATH 或 LUA_PATH_5_3*,或默认路径(由 *luaconf.h 定义)
c loader 查找范围:环境变量 LUA_CPATH 或 LUA_CPATH_5_3*,或默认路径(由 *luaconf.h 定义)
查看 luaconf.h 可知(在 windows 环境下):
lua 用宏定义了默认搜索路径,假设 lua 执行文件所在目录为 X,则
LUA_CDIR*:辅助宏,为 *X
LUA_LDIR:辅助宏,为 *X\*lua
LUA_VDIR*:辅助宏,当前 *lua 版本号组成的名称,例如 lua 5.3 为 5.3
LUA_SHRDIR:辅助宏,为 *X\..\share\lua\*LUA_VDIR
LUA_PATH_DEFAULT:lua loader 默认搜索目录,包括 LUA_LDIR、LUA_CDIR、LUA_SHRDIR 和当前位置 .\
LUA_CPATH_DEFAULT:c loader 默认搜索目录,包括 LUA_CDIR、X\..\lib\lua\LUA_VDIR 和当前位置 .\
就本人而言,为减少环境变量的使用,各项目输出文件遵循 lua 默认搜索路径规则;为简化配置文件,忽略 lua 版本信息,在配置 c/c++ 源码项目时,重点关注 LUA_LDIR 和 LUA_CDIR 的使用。
.lib VS .dll
根据 网友总结的 lib 和 dll 的区别与使用,可概括为:
.lib 文件供其他 c/c++ 项目在编译时使用,如 luasql-sqlite3 源码编译依赖 sqlite3.lib
.dll 文件在文件执行时使用,如 lua 解释器加载 luasocket 时,相关 .dll 文件必须在规定位置出现
因此,.dll 文件位置应在 LUA_CPATH_DEFAULT 范围内,更确切说,在 LUA_CDIR 范围内
visual studio 项目以多个配置文件组织源文件、设置项目的编译环境、以及项目的部署(输出)规则。配置文件的设置以可视化方式进行。
visual studio 项目按照 solution/project 的方式组织,即一个 solution (解决方案)包含多个 project (项目)
项目配置宏
注意与 c/c++ 宏区别。项目配置宏预先定义了一些值,供配置文件使用。如 $(WindowsSDK_IncludePath) 指当前 windows sdk 头文件位置,如 windows.h 所在位置。用 $(…) 符号区分普通值和宏。
重点关注如下宏定义:
$(Platform):目标平台,如 *x86、x64、*arm
$(Configuration):目标配置,如 *debug、*release
$(SolutionDir):解决方案所在路径
*$(SolutionName):解决方案名称
$(ProjectDir):项目所在路径
$(ProjectName):项目名称
*visual studio 还支持用户自定义宏,如图所示
多个项目可使用相同的自定义宏,确保多个项目配置的一致性。
c/c++:附加包含目录(include 头文件目录设置)、预处理器(c/c++ 宏的预编译值设置),如图所示
链接器:附加依赖项(依赖的 .lib 文件名列表)、附加库目录(.lib 文件所在目录),如图所示
其他注意事项
如果编译环境不是 windows 10 和 visual studio 2017,请参考本人的另一篇文章:Visual Studio 2013 编译 c/c++ 问题汇总