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

luasocket 项目源码编译与部署。

  • 分 VS 合

    连载四中,已经建立了 lua 解决方案和 lualibluaexe 两个项目,下一步面临两个选择,一是分,建立 luasocket 解决方案,并在该解决方案下建立项目;二是合,直接在 lua 解决方案下建立项目。选择一可明确区分功能界限,但需要打开多个 IDE 窗口,并要求手动解决依赖关系,如手动选择编译的先后次序;选择二模糊了功能界限,但只需要打开一个 IDE 窗口,并能利用 visual studio 界面设置项目间的依赖关系,实现一键编译。笔者选择二。
    建立 luasocket_socketluasocket_mime 两个项目,如图所示:
    p1
    项目依赖设置,如图所示:
    p2
    目录布局如图所示:
    p3
    其中,src\luasocket-3.0-rc1*\ 存放 *luasocket 源码;vs\lua\luasocket_socket\ 和 *vs\lua\luasocket_mime\ 存放新增的 *luasocket_socketluasocket_mime 两个项目。
  • luasocket_socket 项目

    mime.c 文件外,所有 .c 文件拖放至 luasocket_socket 项目下,并删除 unix 专用源码:serial.cunix.cusocket.c,如图所示:
    p4

visual studio 用户自定义宏如图所示:
p6
c/c++ 预处理参数一:_CRT_SECURE_NO_WARNINGS*,否则出现如下报错信息:
p5
*c/c++
预处理参数二:_WINSOCK_DEPRECATED_NO_WARNINGS*,否则出现如下报错信息:
p7
*c/c++
预处理参数三:LUASOCKET_API=__declspec(dllexport)*,定义导出到 *.dll 的函数
c/c++ 预处理参数设置如图所示:
p8
luasocket_socket 项目配置如图所示:
p9
p10
p11
p12
luasocket_socket 项目编译报错信息如图所示:
p13
查找 luaL_checkint,结果如图所示:
p14
可以看出,
lua 5.3
版本的库文件提供的函数名为 luaL_checkinteger*,而 *luasocket_socket 项目调用的函数名为 luaL_checkint*,修改 *luasocket_socketluasocket.c 文件,把 luaL_checkint 替换为 luaL_checkinteger*,可编译成功。如图所示:
p15
*.lua
文件处理
luasocket 源码包含 .lua 文件,这些文件需要放至特定位置,才能与生成的 .dll 文件一起确保 socket 模块正常运行。.lua 文件的存放位置可参考源代码的帮助文档,如图所示:
p1
mime.lua 文件外,把全部 .lua 文件拖放至 luasocket_socket 项目,如图所示
p2
利用 visual studio 管理机制,对每个 .lua 文件设置输出位置,如图所示:
p3
p4
p5
p6

  • luasocket_mime 项目

    mime.c 文件、mime.lua 文件拖放至 luasocket_mime 项目下,如图所示:
    p7

visual studio 用户自定义宏如图所示:
p8
luasocket_mime 项目配置如图所示:
p9
p10
p11
p12
p13

  • 结束语

    流水帐记录到此,已完成 luasocket 部分的编译。同样,本文只描述做什么,但不深究为什么。visual studio 下编译 c/c++ 项目,注意以下几点,一是要注意头文件搜索位置的设置,二是要注意链接时 .lib 库文件搜索位置的设置,三是链接时 .lib 库文件名字的设置,四是预处理参数的设置,特别是编译 .dll 文件时,需设置 __declspec(dllexport)*,否则即使能够生成 *.dll 文件,该文件仍不能正常使用。如果编译顺利,用如下代码可顺利运行:
    p14