04在Windows下通过VSCode远程Linux服务器调试C/C++加强版Plus(包含使用Cmake配合脚本在VSCode中编译)
01Windows使用VSCode远程Linux(Ubuntu/CentOS)开发/调试C/C++(超详细)
02Windows下利用VSCode调试C/C++代码
03在Windows下通过VSCode远程Linux服务器调试C/C++加强版(包含头文件和链接静态库,动态库的配置)
04在Windows下通过VSCode远程Linux服务器调试C/C++加强版Plus(包含使用Cmake配合脚本在VSCode中编译)
概述:
前面我们讲了如何使用VSCode通过链接静态库和动态库去调试远程Linux的代码,但是这样做是方便我们使用VSCode插件开发的人,当其他不使用VSCode的同事想要编译该项目时也是非常麻烦的。所以我们需要使用Cmake去编译项目了。
选择Cmake的原因:能生成跨平台的makefile,而单独写makefile的话只能在编写的平台中使用,例如Linux下编写的不能在Windows下使用。
1 如何写Cmake
1)首先去到我们项目文件夹下创建一个名字叫CMakeLists.txt的文本文件。
2)然后编写cmake,参考我的,步骤已经注明,按照我的步骤去改相应的头文件目录库文件目录和库文件名即可。
CMakeLists.txt内容如下:
#1.cmake verson,指定cmake版本
cmake_minimum_required(VERSION 3.2)
#2.project name,指定项目的名称,一般和项目的文件夹名称对应
PROJECT(GetInfoProject)
#打印相应变量信息
message(STATUS "PROJECT_BINARY_DIR: ${PROJECT_BINARY_DIR}")
message(STATUS "PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}")
#设置Cmake的调试类型为Debug,必须设置该行才能gdb调试
set(CMAKE_BUILD_TYPE Debug)
#下面三者都可以,区别看注释
#1)判断编译器类型,如果是gcc编译器,则在编译选项中加入c++11支持,编译C代码有警告
#if(CMAKE_COMPILER_IS_GNUCXX)
#add_compile_options(-std=c++11)
#message(STATUS "optional:-std=c++11")
#endif(CMAKE_COMPILER_IS_GNUCXX)
#2)判断编译器类型,如果是gcc编译器,则在编译选项中加入c++11支持,编译C代码没警告(指编译器的警告,并非日志警告)
#if(CMAKE_COMPILER_IS_GNUCXX)
#set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
#message(STATUS "optional:-std=c++11")
#endif(CMAKE_COMPILER_IS_GNUCXX)
#3)或者直接使用这个环境变量设置,fPIC代表多个进程调用该库时,多个进程共用该库,而不各自拷贝,去掉-00可以不打印C语言的日志警告,-g和ggdb3一样,但3会打印更多的调试信息,-Wall会产生一些语法警告,例如int转long这些
#我弃掉-00是为了不想看到ffmpeg那些将要被弃用的字段的日志警告
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -g -ggdb3 -Wall -std=c++11 -fPIC")
#set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -g -ggdb3 -Wall -std=c++11 -fPIC")
message(STATUS "CMAKE_CXX_FLAGS_DEBUG:${CMAKE_CXX_FLAGS_DEBUG}")
#3.包含头文件目录,链接库目录,多个以空格隔开,关键字不区分大小写
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/ffmpeg/include ${PROJECT_SOURCE_DIR}/rapidjson ${PROJECT_SOURCE_DIR}/spdlogInclude)
#LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/ffmpeg/lib /usr/lib/mysql/plugin/)
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/ffmpeg/lib /usr/lib/x86_64-linux-gnu)
#4.工程需要的源文件,可以包含源文件目录下的所有源文件,或者set想要的源文件编译
#AUX_SOURCE_DIRECTORY(./src/ SRC_LIST)
set(SRC_LIST ./src/FFmpeg.h ./src/GetInputVideoInfo.h ./src/GetInputVideoInfo.cpp ./src/main.cpp)
#5.添加要编译生成的可执行文件
ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_LIST})
#6.添加可执行文件所需要的链接库名,参1为生成的可执行文件名
TARGET_LINK_LIBRARIES(${PROJECT_NAME} pthread)
TARGET_LINK_LIBRARIES(${PROJECT_NAME} avcodec)
TARGET_LINK_LIBRARIES(${PROJECT_NAME} avdevice)
TARGET_LINK_LIBRARIES(${PROJECT_NAME} avfilter)
TARGET_LINK_LIBRARIES(${PROJECT_NAME} avformat)
TARGET_LINK_LIBRARIES(${PROJECT_NAME} avutil)
TARGET_LINK_LIBRARIES(${PROJECT_NAME} swresample)
#TARGET_LINK_LIBRARIES(${PROJECT_NAME} postproc)
TARGET_LINK_LIBRARIES(${PROJECT_NAME} swscale)
MESSAGE(STATUS "PROJECT_NAME is: ${PROJECT_NAME}")
3)编写好Cmake内容后,我们实际在xshell或者linux的命令行就可以通过cmake生成makefile执行项目了。命令如下:
mkdir build//建立build是为了将cmake产生的中间文件放在build中,而不放在项目文件夹中造成麻烦
cd build
cmake ..//代表执行上一级文件夹的CMakeLists.txt
make//执行我们刚cmake生成的makefile
4)此时build目录下有我们生成的可执行文件,我们直接执行就可以了。
这样就可以让使用xshell或者命令行的同事通过cmake简单的使用我们的项目了。那我们使用VSCode的人员怎么去使用该Cmake呢?
2 Cmake搭配shell脚本+VScode调试Linux的代码
前提:VSCode打开时必须打开项目的文件夹,不能随便打开其他文件夹再切换到项目的文件夹,否则设置路径和写sh脚本时非常困难。当然,你可以不使用shell脚本,直接使用多个命令去执行也可以,但是没有sh脚本方便,而且这里也讲sh脚本的使用。
1)编写sh脚本,我的已经编写好了,可以直接参考我的。
#!/bin/bash
if [ ! -d "build" ]; then
mkdir build
else
rm -rf build/*
fi
#[]左右必须有空格,-d表示目录名
cd build
#dirname "$0"是一个组合的变量,所以"$(dirname "$0")"代表获取脚本所在路径,只在脚本有效,命令行无效.pwd显示当前路径并将值赋给变量dir
#或者这样理解:$0代表参数1即执行的脚本名字,dirname "$0"后表示取该参数的目录所在路径
workDir=$(cd "$(dirname "$0")"; pwd)
echo "Now Work Dir is in :$workDir"
cmake ..
make && mv ./GetInfoProject ../
2)重写tasks.json的内容。我的如下:
看到吧,比直接使用VSCode的命令链接简洁多了,所以我也推荐大家使用这种方法链接。
//使用shell脚本加cmake代替vscode的tasks内容编译
{
"version": "2.0.0",
"tasks": [
{
"label": "main", //任务名称
"type": "shell", //运行task的平台,一般是shell
//运行你shell的命令,可为bash ./build.sh,注意:之前因为我vscode打开的是项目文件夹的上一层文件夹,所以导致无法在当前目录找到build.sh运行
//这样需要加上你的项目名称,即./xxx/build.sh,同样其它路径也要注意是否需要加上,所以最好是打开项目所在目录否则就会出现路径对不上无法执行编译
"command": "./build.sh",
"group": {
"kind": "build", //设置为build组,这样当你在vscode中执行build命令时,//就能自动执行"command"中的命令了
"isDefault": true
}
}
]
}
3)launch.json和c_cpp_properties.json不需要动它,如果大家没有的话,可以参考我上一篇加强版包含动态库那篇文章,修改一下对应的路径即可。
4)运行
经过以上的步骤,我们已经可以进行调试了,当我们按下F5开始调试,VSCode就会自动执行command命令行的命令,即执行sh脚本的内容。结果如下:
但是使用脚本在VSCode中不能调试打断点,它会直接执行完毕,目前还没时间去研究这个,如果想调试的话就使用我那个加强版的文章的tasks.json即可。](https://i-blog.csdnimg.cn/blog_migrate/2f9a6f8e2ef12cbb205bcbf7204a9c69.png)
5)给出其余两个json的内容,实际上和那个加强版的差不多一样,没有改过什么内容,只是改了项目的名称。
launch.json内容:
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
// launch需要改program,miDebuggerPath即可,但是需要注意preLaunchTask需要与任务的label相同,这样才可以调试对应的任务.
//注意:路径的出错很多时候与我们vscode打开时不是项目所在路径相关
"version": "0.2.0",
"configurations": [
{
"name": "GetInfoProject", //名称随便取,一般和任务名都取项目名字
"type": "cppdbg", //调试类型
"request": "launch", //请求配置类型
"program": "${workspaceFolder}/GetInfoProject", //可执行程序完整路径(包含程序名称),必须正确,否则无法调试可执行程序
"args": [],
"stopAtEntry": false,//程序调试时是否暂停在程序入口处
"cwd": "${workspaceFolder}", //调试程序时的工作目录,一般为${workspaceFolder}即代码所在目录
"environment": [],
"externalConsole": false,//调试时是否显示控制台窗口,一般设为true显示控制台窗口,即cmd窗口
"MIMode": "gdb", //调试模式,一般是gdb
"miDebuggerPath": "/usr/bin/gdb", //调试路径,即gdb完整路径,Windows时需要配置环境变量,改成该Min路径
"preLaunchTask": "GetInfoProject", //调试前开始执行的任务名称(与tasks.json中名称一致),如果有多个任务,这里可以唯一指定想要调试的任务
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
}
]
}
c_cpp_properties.json内容:
//本文一般需要改编译的命令compileCommands,和只能检索头文件的includePath路径.
//includePath是你其它文件能否被检测的重要字段.
//例如"spdlog/spdlog.h"头文件,若不包含/home/tyy/spdlog/include,则显示红色错误
//注意:路径的出错很多时候与我们vscode打开时不是项目所在路径相关
{
"configurations": [
{
"name":"gdb",//或者MinGW64(WIndows编译器)
"intelliSenseMode":"gcc-x64",
"compileCommands": "/usr/bin/gcc", //此文件一般只需改这里,g++,gcc,gdb都可以
"includePath": [ //添加自己项目目录的对应头文件路径,让vscode智能检索,但不是编译的包含头文件,两者不一样
"/usr/local/include",
"${workspaceFolder}/spdlogInclude",
"${workspaceFolder}/ffmpeg/include", //workspaceFolder代表你vscode打开的工作目录,即左上角的大写字体
"${workspaceFolder}/rapidjson" //rapidjson
],
"cStandard": "c11",
"cppStandard": "c++11"
}
],
"version": 4
}
好了,关于VScode的使用的介绍文章到此结束,总共四篇。
这里强调一下想要VSCode中调试Cmake必须加上这行命令,-g(-ggdb3)就不用说了:
#设置Cmake的调试类型为Debug,必须设置该行才能gdb调试
set(CMAKE_BUILD_TYPE Debug)
2843



被折叠的 条评论
为什么被折叠?



