前提
cmake – 构建工具
make工具链:gcc 正对windows有mingw
20240402更新 CMakeList
使用vscode的cmake工具,ctrl+shif+p :QUICK start
编译目标
cmake_minimum_required(VERSION 3.0.0)
project(mscrewmotor VERSION 0.1.0 LANGUAGES C)
message("===========CMAKE START==============")
include(CTest)
enable_testing()
set(ROOT_DIR "C:/User/")
message(${ROOT_DIR})
include_directories(${ROOT_DIR}/test)
set(SRC_LIST ${ROOT_DIR}/test/main.c )
#设置可执行文件输出路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build)
#设置可执行文件输出路径
set( CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/build)
#生成可执行文件(.exe)
add_executable(mscrewmotor ${SRC_LIST})
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
多目标的cmakelist
根目录的makelist 通过add_subdirectory 添加多个子目录的编译目标
add_subdirectory (${PROJECT_SOURCE_DIR}/test/mscrewmotor)
vscode 的output窗口无法对错误进行高亮-很难受
即使增加add_compile_options(“-fdiagnostics-color=always”) 也不好使
vscode切换编译对象/切换调试对象
目的
因为需要使用makefile来管理多个文件,makefile针对不同的平台编写方式有不一样,则需要通过cmake工具自动生成对应平台的makefile文件。前提需要CmakeLists.txt文件;
环境
windows 下使用vscode+cmake调试c/c++;
通过搭建cmake的环境,对tasks.json和的作用有了一定的认识。
整体的调用过程,在“”动作之前先完成preLaunchTask(在launch.json中指定)任务,完成之后再配置launch.json;
launch.json
用来配置如何启动调试程序,程序的位置,调试的工具,所传参数等。
"configurations": [
{
"name": "gcc.exe - 生成和调试活动文件", //显示在“调试”(Run)侧边栏的名称;
"type": "cppdbg", //类型,针对C语言环境不能改;
"request": "launch", //有launch和attach可选,这里填launch,按下F5就可以启动调试了;而不是attach(附加);
"program": "${fileDirname}\\build\\${fileBasenameNoExtension}.exe",//程序所在路径和程序名,使用了build文件夹保存了编译过程数据
"args": [], //这里填命令行参数(main函数的形参),如果没有可不填;
"stopAtEntry": false, //true:在开始运行程序时,先暂停一;false:直接运行;
"cwd": "D:\\MinGW64\\bin", //调试程序文件夹;
"environment": [], //临时手动添加环境变量;
"externalConsole": true,
"MIMode": "gdb", //指定调试器gdb
"miDebuggerPath": "D:\\MinGW64\\bin\\gdb.exe",//调试器程序的路径
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
// preLaunchTask 表示在执行调试前要完成的任务 ,与tasks.json 中 lable 标记的任务名称相同
"preLaunchTask": "tasks_makeRun"
}
]
其中“preLaunchTask”参数起到了链接tasks.json文件的作用;
tasks.json
执行预定的任务:如何重新生成这个新的程序。
文件可能需要执行多个任务,多个任务间的顺序通过“dependsOn”链接到前置的任务;
例子中包含了三个子任务。
任务一: 创建 build 文件夹;
任务二:执行Cmake命令;
任务三: 执行make编译;
"tasks": [
// 任务一: 创建 build 文件夹
{
"type": "shell",
"label": "tasks_CreateBuildDir", // lable 标记任务名称
"command": "mkdir", // 命令
// 传给上面命令的参数,这里是传给 Unix 系统的参数,windows下稍有不用,下边有
"args": [
"-p",
"build"
],
"windows": {
"options": {
"shell": {
"executable": "powershell.exe"
}
},
"args": [
"-Force",
"build"
],
},
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
},
// 任务二: 执行Cmake命令 在 build 文件夹中调用 cmake 进行项目配置如果想配置比如 release 还是 debug 可以添加参数或者在CMakeLists.txt中设置也行
{
"type": "shell",
"label": "tasks_cmake", // 给这个任务起个名字
"command": "cmake",
"args": [
"-G",
"\"MinGW Makefiles\"",
".." // .. 表示build文件夹的上级目录,CMakeLists.txt就放在上级目录中
],
"options": {
"cwd": "${workspaceFolder}/build"
},
"dependsOn":[
"tasks_CreateBuildDir" // 表示在 创建目录 任务结束后进行
]
},
// 任务三: 执行make编译,mingw32-make命令
{
"type": "shell",
"label": "tasks_makeRun",//显示在终端 任务名称中
"command": "mingw32-make", // 这个也是MinGW目录下bin目录下的mingw32-make.exe,如果添加了环境变量,这里直接写mingw32-make.exe
"args": [],
"options": {
"cwd": "${workspaceFolder}/build"
}, // 注意这里是编译到了项目文件夹下的 build 文件夹里面,所以launch.json 中 program 路径要那么设置( "program": "${fileDirname}\\build\\${fileBasenameNoExtension}.exe",/)
"dependsOn":[
"tasks_cmake" // 依赖于:Cmake任务
]
},
通过“dependsOn”体现了任务之前的执行顺序。
== “command”: “mingw32-make”, 有些通过重定义mingw32-make命令为make==