Windows下编译lua源码指北

文章目录

      • 为什么要生成dll?
      • 一、下载lua源码并解压
      • 二、打开Visual Studio 2017创建一个空的项目
      • 三、导入资源文件
      • 四、移除lua.c和luac.c文件(可选操作)
      • 五、添加预处理宏
            • Q1: 这里我们为什么要添加预处理宏呢?
            • Q2: 那么 __declspec(dllexport) 有什么作用呢?
            • Q3: 如何查看导出的dll是不是坏的
      • 六、选择生成dll模式
      • 七、build
      • 八、采用nmake方式编译

为什么要生成dll?

https://www.lua.org/manual/5.4/readme.html 官网中有这么一段话, 意思是Windows平台建议生成dll, 而不是静态库,但是为什么有这个建议呢? 直接看第五节
在这里插入图片描述

一、下载lua源码并解压

https://github.com/lua/lua/releases


二、打开Visual Studio 2017创建一个空的项目

在这里插入图片描述


三、导入资源文件

解决方案资源管理器>>资源文件>>右键添加>>现有项>>选择解压好的lua源码


四、移除lua.c和luac.c文件(可选操作)

解决方案资源管理器>>资源文件>>找到lua.c文件>> 右键移除


五、添加预处理宏

右键解决方案>>属性>>C/C++>>预处理器>>预处理器定义>>在最前面添加LUA_BUILD_AS_DLL;

Q1: 这里我们为什么要添加预处理宏呢?

因为luaconf.h文件中,有这么一段:

1
2
3
4
5
6
7
8
9
10
11
12
13
#if defined(LUA_BUILD_AS_DLL)   /* { */

#if defined(LUA_CORE) || defined(LUA_LIB)   /* { */
#define LUA_API __declspec(dllexport)
#else                       /* }{ */
#define LUA_API __declspec(dllimport)
#endif                      /* } */

#else               /* }{ */

#define LUA_API     extern

#endif              /* } */
Q2: 那么 __declspec(dllexport) 有什么作用呢?

其作用是导出函数到dll中,给接口提供一个外部调用方式,能够使程序在没有导入lib库时, 通过dll动态调用。

也就是说导出的dll如果没有 __declspec(dllexport) 符号就算是导出失败

Q3: 如何查看导出的dll是不是坏的

VS 提供了一个工具:bumpbin , 用VS自带的命令行打开即可

1
bumpbin /exports xxx.dll

结果如下:
在这里插入图片描述


六、选择生成dll模式

右键解决方案>>属性>>常规>>项目默认值>>配置类型选择dll


七、build

八、采用nmake方式编译

传送门