淘先锋技术网

首页 1 2 3 4 5 6 7

背景

Lua语言是一种脚本语言,边解释边执行,和python有点像。据说在游戏后台应用很多,它的最牛逼之处在于:

  • 体量小,很适合在嵌入式系统中使用;
  • 与C/C++混合使用灵活;

当然,个人认为Lua作为一款开源解释器,或许在机器人/数控系统中会有很好的应用前景。毕竟,自己写一款能稳定运行的解释器还是很不容易的,何不拿来就用。好,扯淡完毕,开始今天的主题,在VS Code下编译和调试Lua和它的C API:

  1. OS:Windows10
  2. 编译器:MinGW-64
  3. 编辑器:VS Code

环境搭建

  1. 安装MinGW-64和VS Code 参见之前的帖子
  2. 下载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开始调试:
在这里插入图片描述可以调试了。
F5while循环跑起来,在控制台上输入Lua命令应该会有响应。
在这里插入图片描述