本文介绍如何使用CMake与mingw进行C/C++代码的开发编译调试工作
C/C++
C++ Intellisense
CMake
CMake tools
CMake Tools Helper
接下来创建一个可用的工程模板,构建了第一个后,其他工程基于模板来复制一份即可。
这个部分设计3个非常简单的文件,实现hello world功能:func.c 、func.h 、main.c。
#include "stdio.h"
void FUNC_Print(void)
{
printf("Hello, this is print function.\n");
}
#ifndef FUNC_H
#define FUNC_H
void FUNC_Print(void);
#endif
#include "func.h"
int main(void)
{
FUNC_Print();
return 0;
}
本工程中分了3个CMake文件,根目录CMake、src目录CMake、test目录CMake
cmake_minimum_required(VERSION 3.16)
PROJECT(example)
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
include_directories(.)
include_directories(${PROJECT_SOURCE_DIR}/src)
include_directories(${PROJECT_SOURCE_DIR}/include)
add_subdirectory(src)
add_subdirectory(test)
PROJECT(mytest)
aux_source_directory(. SRC)
add_library(mytest ${SRC})
PROJECT(main)
aux_source_directory(. SRC)
add_executable(main ${SRC})
target_link_libraries(main mytest)
这部分分为2个文件,一般来说只需再新建工程模板的时候需要配置,之后直接复制该模板,就基本不需要改动,了解即可
{
"version": "0.2.0",
"configurations": [
{
"name": "gcc.exe - 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}\\build\\test\\main.exe", // 生成的可执行文件
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "D:\\work\\mingw64\\bin\\gdb.exe", // gdb 的路径
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
}
]
}
{
"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools"
}
为了不想让CMake执行后的缓存与Makefiile文件在工程的各个目录下满天飞,引入了build目录,将过程文件都统一存放在buiild中,保持工程目录的整洁。
构建工程有2个步骤:
cd .\build\
若是第一次构建工程,带上 -G 参数,CMake 总是需要找到CMakeList.txt 作为入口,由于在该工程下,工程根目录下的CMakeList.txt 是主入口(多团队开发的工程,可以不止一个CMake入口)cmake .. -G "Unix Makefiles"
若是之后构建,直接cmake …cmake ..
make
代码行数稍微多一点的,可以带上 -j 参数,开启多线程编译,线程不是开的越多越好,受编译器优化与能否并行处理的文件影响,所以并不是成倍的缩减时间,一般做法是根据CPU的线程数来设置即可,例如我的是6核12线程,那么使用 -j12,也能达到比较快的编译效果。make -j12
如果是第一次用,这一步一般会提示找不到make的,不要慌,这是因为mingw的make是带前缀的,需要重命名。
进入mingw的bin文件夹内,找到一个叫mingw-make.exe的文件,复制一个,改成make就好了,由于前面已经将这个目录路径加到系统变量里,所以其他地方直接用make的话就可以调用它。接下来在重新 make 试试吧。
launch.json 文件中已经配置好 gdb 的路径,因此调试的过程中,vscode会以来gdb的命令,好处是不需要手动的敲gdb命令,可以可视化的看到栈、变量值、地址等信息,同时也可打断点。
按F5即可启动调试,若没有打断点,则直接运行,可以在终端看到运行的结果,蓝色框中的是按F5后,执行的命令,红色框则是运行程序的输出。
OK,至此已经搭建完工程,后续有新的项目需要,直接按照这个套路搭建环境,或者拷贝一份过去改也行,其实想要利用vscode跑通工程,关键是要配置json文件即可,CMake的话,一处通,处处通,因为CMake的本质是跨平台构建工具,语法简单好用,更加不会受编辑器的限制。