嵌入式开发:VSCode中,基于CMake开发

发布于 2023-10-19 11:08
浏览
0收藏

作为一个程序员,VSCode、CMake并不陌生,然而,在MCU的开发过程中,底层很少选择使用CMake去编译工程,多数还是使用目标芯片对应的工具链编译,常见的编译器:HighTec、Tasking、GreenHills、Keil等等。如果进行SOA(Service Oriented Architecture)架构开发,使用一些软实时操作系统时(eg:Linux),搭配CMake使用,构建进程的编译会方便很多。本文,主要介绍VSCode+CMake环境搭建以及示例。

提示:本文操作系统Windows10 64b

1、VSCode、CMake安装

关于VSCode、CMake的安装教程,网上很多,本文不过多赘述。


(一)VSCode官方下载地址

链接:

​https://code.visualstudio.com/download​


(二)CMake的官方下载地址

链接:https://cmake.org/download/


(三)MinGW的官方下载地址

链接:https://osdn.net/projects/mingw/


(四)VSCode插件安装

1、CMake、CMake Tools插件安装,如下所示:

嵌入式开发:VSCode中,基于CMake开发 -汽车开发者社区

2、C/C++、C/C++ Extension Pack插件安装,如下所示:

嵌入式开发:VSCode中,基于CMake开发 -汽车开发者社区

2、源文件编写及编译

编写源文件之前,先创建一个工作区,操作如下:文件->打开文件夹...(选择一个目标文件夹)。

嵌入式开发:VSCode中,基于CMake开发 -汽车开发者社区

本文在VSCode_CMake文件夹下创建工作区,如下所示:

嵌入式开发:VSCode中,基于CMake开发 -汽车开发者社区

(一)CMakeLists.txt文件编写

CMakeLists.txt文件内容如下所示:

 # 设置项目名称
 project(CMakePro)

 set(CMAKE_C_COMPILER "gcc")
 set(CMAKE_CXX_COMPILER "g++")

 #指定CMake版本
 set(CMAKE_CXX_STANDARD 11)
 
 # 将当前文件中的所有文件放到变量DIR_TOOT_SRCS中
 # aux_source_directory 查找某路径下的所有源文件,"."表示当前路径
 aux_source_directory(. DIR_TOOT_SRCS)
 # 将变量DIR_TOOT_SRCS中的源文件编译源码生成目标,目标文件名称CMakePro
 add_executable(CMakePro ${DIR_TOOT_SRCS})

(二)源文件编辑

main.cpp文件内容如下所示:

 #include <iostream>
 #include <vector>
 #include <string>
 
 using namespace std;
 
 int main()
 {
     vector<string> MsgInfo {"HelloWorld","VSCode","CMake"};
 
     for (const string& info : MsgInfo)
     {
         cout << info << " " << endl;
     }
     getchar();
 }

(三)另存工作区

具体操作:文件->将工作区另存为...

嵌入式开发:VSCode中,基于CMake开发 -汽车开发者社区

自定义工作的名称,本文VSCode_CMake,文件后缀.code-workspace,如下所示:

嵌入式开发:VSCode中,基于CMake开发 -汽车开发者社区

VSCode_CMake.code-workspace内容如下所示,设置CMake的IDE,本文选则"MinGW Makefiles"。

嵌入式开发:VSCode中,基于CMake开发 -汽车开发者社区

添加内容如下所示:

"cmake.generator": "MinGW Makefiles"

使用快捷键:Ctrl+Shift+P,选择目标CMake工具包,如下所示:

嵌入式开发:VSCode中,基于CMake开发 -汽车开发者社区

本文选择"GCC 12.2.0 x86_64-w64-mingw32",如下所示:

嵌入式开发:VSCode中,基于CMake开发 -汽车开发者社区

3、编辑配置文件

(1)创建.vscode文件夹

嵌入式开发:VSCode中,基于CMake开发 -汽车开发者社区

(2)创建c_cpp_properties.json文件

文件内容如下:

 {
     "configurations": [
       {
         "name": "GCC",
         "defines": ["_DEBUG", "UNICODE", "_UNICODE"],
         //g++路径
         "compilerPath": "C:/msys64/mingw64/bin/g++.exe",
         "cStandard": "c11",
         "cppStandard": "c++17",
         "intelliSenseMode": "windows-gcc-x64",
         "configurationProvider": "vector-of-bool.cmake-tools",
         "includePath": [
           "${default}",
           "${workspaceFolder}/**"
         ]
       }
     ],
     "version": 4
 }

(3)创建launch.json文件

launch.json文件内容如下所示:

 {
     "version": "0.2.0",
     "configurations": [
       {
         "name": "C/C++: g++.exe build and debug active file",
         "type": "cppdbg",
         "request": "launch",
        "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
         "args": [],
         "stopAtEntry": false,
         "cwd": "${fileDirname}",
         "environment": [],
         "externalConsole": true,
         "MIMode": "gdb",
         "miDebuggerPath": "C:\\msys64\\mingw64\\bin\\gdb.exe",
         "setupCommands": [
           {
             "description": "Enable pretty-printing for gdb",
             "text": "-enable-pretty-printing",
             "ignoreFailures": true
           }
         ],
         "preLaunchTask": "g++"
       }
     ]
   }

{"version": "0.2.0","configurations": [      {"name": "C/C++: g++.exe build and debug active file","type": "cppdbg","request": "launch","program": "${fileDirname}\\${fileBasenameNoExtension}.exe","args": [],"stopAtEntry": false,"cwd": "${fileDirname}","environment": [],"externalConsole": true,"MIMode": "gdb","miDebuggerPath": "C:\\msys64\\mingw64\\bin\\gdb.exe","setupCommands": [          {"description": "Enable pretty-printing for gdb","text": "-enable-pretty-printing","ignoreFailures": true          }        ],"preLaunchTask": "g++"      }    ]  }

(4)创建tasks.json文件

tasks.json文件内容如下所示:

 {
     "tasks": [
       {
        "type": "cppbuild",
         "label": "g++",
         "command": "C:\\msys64\\mingw64\\bin\\g++.exe",
         "args": [
           "-fdiagnostics-color=always",
           "-g",
           "${file}",
           "-o",
           "${fileDirname}\\${fileBasenameNoExtension}.exe"
         ],
         "options": {
           "cwd": "${fileDirname}"
         },
         "problemMatcher": ["$gcc"],
         "group": {
           "kind": "build",
           "isDefault": true
         },
         "detail": "Task generated by Debugger."
       }
     ],
     "version": "2.0.0"
  }

当然,如上的*.json文件也可以通过"调试配置"自动生成,选择调试方式,会自动生成对应的*.json文件,如下所示:

嵌入式开发:VSCode中,基于CMake开发 -汽车开发者社区

注意:tasks.json文件的label与launch.json文件中的preLaunchTask保持一致,如下所示:

嵌入式开发:VSCode中,基于CMake开发 -汽车开发者社区

参考资料:​https://code.visualstudio.com/docs/cpp/config-mingw

4、使用CMake编译源文件

可以在终端使用命令查看CMake和Make的安装情况,如下所示:

嵌入式开发:VSCode中,基于CMake开发 -汽车开发者社区

如果习惯了bash命令,只要安装了git,可以切换shell,在终端输入:bash,如下所示:

嵌入式开发:VSCode中,基于CMake开发 -汽车开发者社区

CMake编译之前,可以先将本地安装的CMake.exe路径添加到"设置"中,如下所示:

嵌入式开发:VSCode中,基于CMake开发 -汽车开发者社区

(一)终端中,手动进行源文件编译

1、使用cmake命令,如下所示:

cmake -S . -B Build -G "MinGW Makefiles"

这里为什么使用上述命令,可以参考如下链接:

https://cmake.org/cmake/help/latest/manual/cmake.1.html

提示:-B 构建项目文件所在的目录,-G(Generator ),设置 IDE。

在源文件对应的文件夹下会自动生成一个build文件夹,如下所示:

嵌入式开发:VSCode中,基于CMake开发 -汽车开发者社区

2、使用make命令,生成可执行文件(CMakePro),如下所示:

嵌入式开发:VSCode中,基于CMake开发 -汽车开发者社区

生成的CMakePro.exe文件如下所示:

嵌入式开发:VSCode中,基于CMake开发 -汽车开发者社区

提示:如上的操作可以通过批处理文件操作。


(二)使用CMake进行源文件编译


1、单击"CMake"图标,配置项目

嵌入式开发:VSCode中,基于CMake开发 -汽车开发者社区

2、进行项目配置,如下所示

嵌入式开发:VSCode中,基于CMake开发 -汽车开发者社区

3、编译文件,通过"输出"窗口查看输出信息,如下所示:

嵌入式开发:VSCode中,基于CMake开发 -汽车开发者社区

生成文件,均输出到build文件夹,与手动执行命令产生的结果一致,如下所示:

嵌入式开发:VSCode中,基于CMake开发 -汽车开发者社区

最后,进行目标文件,在终端(eg:PowerShell)运行可执行文件,本文示例如下:

嵌入式开发:VSCode中,基于CMake开发 -汽车开发者社区

5、Debug程序

(一)在调试C/C++文件中选择"调试C/C++文件",如下所示:

嵌入式开发:VSCode中,基于CMake开发 -汽车开发者社区

(二)程序调试如下所示:

嵌入式开发:VSCode中,基于CMake开发 -汽车开发者社区

提示:生成可执行文件以后,方可调试。


文章转载自公众号:开心果 Need Car

分类
收藏
回复
举报
回复
相关推荐