背景
Lua语言是一种脚本语言,边解释边执行,和python有点像。据说在游戏后台应用很多,它的最牛逼之处在于:
- 体量小,很适合在嵌入式系统中使用;
- 与C/C++混合使用灵活;
当然,个人认为Lua作为一款开源解释器,或许在机器人/数控系统中会有很好的应用前景。毕竟,自己写一款能稳定运行的解释器还是很不容易的,何不拿来就用。好,扯淡完毕,开始今天的主题,在VS Code下编译和调试Lua和它的C API:
- OS:Windows10
- 编译器:MinGW-64
- 编辑器:VS Code
环境搭建
- 安装MinGW-64和VS Code 参见之前的帖子。
- 下载Lua源码
https://www.lua.org/download.html
编译过程
Lua库编译
将Lua源码拷贝到一个工作路径下,例如我的工作路径为:
C:\Lua_source
用VS Code 打开这个工作目录。
在菜单栏上Terminal–> New Terminal
下方弹出了windows的控制台,可以直接使用MinGW的命令进行编译:
cd C:\Lua_source
make mingw
生成很多文件,当然最重要的是:
注意:MinGW-64的gcc, gdb, make 等命令有可能会报错,这是因为MingGW64\bin
路径下这些组件的原来的名字不是gcc,gdb,make,而是这些名字:
直接改成gcc.exe, gdb.exe, make.exe
放在原来的路径下。
C-API编译调试
下面是本文的主要内容。
测试主程序
在刚才的路径下新建文件夹:C:\Lua_source\test_prj
. 把C:\Lua_source\src
路径下的所有头文件拷贝到C:\Lua_source\test_prj\header
下(当然可以不用全拷,这里不想动脑子就全都拷过来,以后有时间慢慢研究)。
用VS Code在C:\Lua_source
下新建一个LuaC_Test.c
作为测试主程序:
#include "string.h"
#include "header/lua.h"
#include "header/lauxlib.h"
#include "header/lualib.h"
int main()
{
char buff[256] = {0};
int error;
lua_State *L = luaL_newstate(); // ??Lua
luaL_openlibs(L); // ?????
while (fgets(buff, sizeof(buff), stdin) != NULL)
{
error = luaL_loadbuffer(L, buff, strlen(buff), "line")
|| lua_pcall(L, 0, 0, 0);
if (error)
{
fprintf(stderr, "%s", lua_tostring(L, -1));
lua_pop(L, 1); // ?????????
}
}
lua_close(L);
return 0;
}
配置文件
c_cpp_properties.json
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/*",
"${workspaceFolder}/header/*",
"C:/MinGW64/include/*",
"C:/MinGW64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/*",
"C:/MinGW64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++",
"C:/MinGW64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/x86_64-w64-mingw32/bits/*",
"C:/MinGW64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/x86_64-w64-mingw32/ext/*",
"C:/MinGW64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/backward/*"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"windowsSdkVersion": "8.1",
"compilerPath": "C:/MinGW64/bin/gcc.exe",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "gcc-x64"
}
],
"version": 4
}
launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "g++Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}\\luac_test.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "C:\\MinGW64\\bin\\gdb.exe",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "bulid"
}
]
}
task.json
{
"version": "2.0.0",
"tasks": [
{
"label": "bulid",
"type": "shell",
"command": "gcc",
"args": [
"-g",
"${workspaceFolder}\\luac_test.c",
"-llua",
"-o",
"${workspaceFolder}\\luac_test.exe"
],
"options": {
"cwd": "C:\\MinGW64\\bin"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
-llua导入
姑且就叫-llua
导入吧,这个地方卡了好久,编译的时候总是提示:
编译器不知道-llua
为何物,查了很久资料找到答案,把编译Lua时候生成的liblua.a
拷贝到C:\MinGW64\lib
下即可。
调试
在编译调试之前,把刚才编译Lua生成的文件拷贝到测试程序可执行文件的路径(原则上应该做这一步,不过我的电脑上没有拷贝那几个文件竟然也能跑起来,可能liblua.a
里面全包含了吧)。
开始编译Shift+Ctrl+B
看来编译成功了。
按F5
开始调试:
可以调试了。
F5
让while
循环跑起来,在控制台上输入Lua命令应该会有响应。