VSCode编译调试复杂C/C++项目

一、前言

今天用VS2019写项目的时候,突然给我疯狂报错,说运行时"DLL Initialization failed",我这项目完全没有任何动态库依赖,那意思你Windows自己的kernel都加载不好呗。

一气之下我决定换vscode写了,反正前端部分也是用vscode,后端能统一那是最好,查了半天,配置了一通终于搞好了,这里记录一下,也方便大家少走弯路。

二、安装编译器

VSCode本身只是一个编辑器,它是没有能力进行编译和调试的,所以需要额外装一个编译器。这里我推荐使用TDM_GCC,原因无他,一个安装包就全搞定了(记得让它自己添加环境变量),比MinGW方便点。Linux下你直接apt装一个g++就可以了。

这里安装结束后还需要做一个小修改,到TDM-GCC-64\bin中找到mingw32-make.exe,把它重命名成make.exe,这样是为了和Linux下指令统一。

三、创建项目目录

创建项目时,结构清晰总是没有错的。按照我个人的习惯,会把项目目录建成下面的格式:

├── include
├── src
├── lib
├── test
└── output
  1. include,用于存放所有头文件
  2. src,用于存放所有源文件
  3. lib,用于存放可能的动态链接库
  4. test,用于存放测试脚本
  5. output,用于存放编译后的可执行文件

四、Makefile

“Building Tool is The Key”,Makefile就是我选择的构建工具。虽然一般复杂一些的项目都是用CMake,但是作为Linux自带,GCC附带的make工具足够我们平时的项目使用了。

下面我给出一份Linux和Windows(需要安装TDM_GCC)通用的Makefile文件:

#
# 'make'        build executable file 'main'
# 'make clean'  removes all .o files
# 'make clean_all' removes all .o and executable files

# define debug/release mode
ver = release

# define Platform Architecture(32/64)
ARCH := 64

# define the Cpp compiler to use
CXX := g++

# define any compile-time flags
ifeq ($(ver), release)
CXXFLAGS	:= -std=c++17 -O3
else
CXXFLAGS	:= -std=c++17 -Werror -g
endif

# define library paths in addition to /usr/lib
#   if I wanted to include libraries not in /usr/lib I'd specify
#   their path using -Lpath, something like:
LFLAGS =

# define program name
PROGRAM	:= main

# define output directory
OUTPUT	:= output

# define source directory
SRC		:= src

# define include directory
INCLUDE	:= include

# define lib directory
LIB		:= lib/lib$(ARCH)

ifeq ($(OS),Windows_NT)
MAIN	:= $(PROGRAM).exe
SOURCEDIRS	:= $(SRC) $(shell powershell "Get-ChildItem -Path $(SRC) -Recurse -Directory | Select-Object FullName")
INCLUDEDIRS	:= $(INCLUDE)
LIBDIRS		:= $(LIB)/win
FIXPATH = $(subst /,\,$1)
RM			:= del /q /f
MD	:= mkdir
else
MAIN	:= $(PROGRAM)
SOURCEDIRS	:= $(shell find $(SRC) -type d)
INCLUDEDIRS	:= $(shell find $(INCLUDE) -type d)
LIBDIRS		:= $(shell find $(LIB)/linux -type d)
FIXPATH = $1
RM = rm -f
MD	:= mkdir -p
endif

# define any directories containing header files other than /usr/include
INCLUDES	:= $(patsubst %,-I%, $(INCLUDEDIRS:%/=%))

# define the C libs
LIBS		:= $(patsubst %,-L%, $(LIBDIRS:%/=%)) $(patsubst $(LIBDIRS)/lib%.a,-l%, $(wildcard $(LIBDIRS)/*.a)) 

# define the C source files
SOURCES		:= $(wildcard $(patsubst %,%/*.cpp, $(SOURCEDIRS)))

# define the C object files 
OBJECTS		:= $(SOURCES:.cpp=.o)

#
# The following part of the makefile is generic; it can be used to 
# build any executable just by changing the definitions above and by
# deleting dependencies appended to the file from 'make depend'
#

OUTPUTMAIN	:= $(call FIXPATH,$(OUTPUT)/$(MAIN))

all: $(OUTPUT) $(MAIN)
	@echo Executing 'all' complete!

$(OUTPUT):
	$(MD) $(OUTPUT)

$(MAIN): $(OBJECTS) 
	$(CXX) $(CXXFLAGS) $(INCLUDES) -o $(OUTPUTMAIN) $(OBJECTS) $(LFLAGS) $(LIBS)

# this is a suffix replacement rule for building .o's from .c's
# it uses automatic variables $<: the name of the prerequisite of
# the rule(a .c file) and $@: the name of the target of the rule (a .o file) 
# (see the gnu make manual section about automatic variables)
.cpp.o:
	$(CXX) $(CXXFLAGS) $(INCLUDES) -c $<  -o $@

.PHONY: clean clean_all
clean:
	$(RM) $(call FIXPATH,$(OBJECTS))
	@echo Cleanup .o files complete!

clean_all:
	$(RM) $(OUTPUTMAIN)
	$(RM) $(call FIXPATH,$(OBJECTS))
	@echo Cleanup all complete!

run: all
	./$(OUTPUTMAIN)
	@echo Executing 'run: all' complete!

这份Makefile文件是完全对应之前的项目结构,支持src和Include中继续设置子目录。

  1. make (ver=release/debug)。构建项目,默认以release模式构建
  2. make clean。删除所有生成的.o文件
  3. make clean_all。删除所有生成的文件
  4. make run。编译并运行生成的可执行文件

五、VSCode设置

请确认安装了C/C++插件

5.1 tasks.json

VSCode虽然不能编译代码,但是它可以执行脚本,也就是自带的Task Runner,我们就是基于此来实现编译调试。

首先ctrl+shift+p调出命令栏,输入task,应该可以看到任务:配置任务,回车之后会让你选择模板(取决于你当前打开的文件),我们不需要,随便选生成tasks.json文件即可。打开替换成以下内容:

{
    "tasks": [
        {
            "type": "shell",
            "label": "build",
            "command": "make ver=debug -j4",
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": "$gcc"
        },
    ],
    "version": "2.0.0"
}

这个文件是用来自定义任务的,我们这里定义了:

  1. label:一个叫做“build”的任务
  2. type:这是一个用命令行(shell)执行的任务
  3. command:它执行的指令是"make ver=debug -j4"。也就是以debug模式编译,-j4是启用四个线程,可以加快编译速度
  4. group:这个是用来配合快捷键的,当kind设置为"build"后,你可以用ctrl+shift+b快速构建
  5. problemMatcher:当你的命令执行并报错后,将交由gcc负责处理并转发到VSCode的Problems界面。

5.2 launch.json

任务定义好之后需要有人来执行,VSCode左侧菜单栏的第四项Debug点击后,可以创建launch.json文件。同样的,随便选模板,替换为以下内容:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/output/main.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "E:\\Develop\\TDM-GCC-64\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "build"
        }
    ]
}

这里我们定义了按下F5之后运行的流程:

  1. name:启动的是脚本名叫"(gdb) Launch"
  2. type:cppdbg,cpp debug
  3. program:启动的文件,这里你需要给出你自己设定的可执行文件名字(我这儿给的main.cpp)。
  4. MIMode:gdb。如果你需要Debug,那么这里必须设置,支持gdb和lldb。
  5. miDebuggerPath:请修改为你自己的gdb所在路径
  6. preLaunchTask:意思是在启动program之前,先要做什么,那肯定需要先编译啊,所以我们给了上面tasks中设置的任务名,“build”。

六、Go!

好了,此时你只需要按下F5,或者在顶部菜单中选:运行->启动调试,就大功告成了。

Debug实例

七、注意

  1. 如果用VSCode作为C/C++的编程环境,一些编辑器相关的问题,比如额外的IncludePath,需要在ctrl+shift+p,寻找C/C++: 编辑配置(JSON),然后修改。
  2. GDB在Windows下不支持动态断点,也就是说你需要先打好断点,再F5启动,否则是断不住的。

八、参考

  1. Setup Visual Studio Code for Multi-File C++ Projects
  2. Debug a C++ project in VS Code
  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 1. 首先,你需要安装Visual Studio Code编辑器,可以在官网下载安装包进行安装。 2. 安装完成后,打开Visual Studio Code,点击左侧的“扩展”按钮,在搜索框中输入“C/C++”,选择安装“C/C++”扩展。 3. 安装完成后,点击左侧的“文件”按钮,选择“打开文件夹”,选择你要编写C/C++代码的文件夹。 4. 在文件夹中创建一个新的C/C++文件,例如“main.c”。 5. 在编辑器中输入C/C++代码,保存文件。 6. 点击左侧的“调试”按钮,选择“添加配置”,选择“C++(GDB/LLDB)”,会自动生成一个“launch.json”文件。 7. 在“launch.json”文件中,配置编译器路径和调试器路径,例如: "configurations": [ { "name": "(gdb) Launch", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/main", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": true, "MIMode": "gdb", "miDebuggerPath": "/usr/bin/gdb" } ] 8. 点击左侧的“调试”按钮,选择“启动调试”,即可开始调试C/C++代码。 注意:以上是在Linux系统下的配置方法,如果你使用的是Windows系统,需要下载安装MinGW或者Visual Studio等C/C++编译器和调试器,并在“launch.json”文件中配置相应的路径。 ### 回答2: VScode是一个非常流行的轻量级编辑器,它可以安装和配置C/C++环境。以下是有关如何在VScode中安装和配置C/C++环境的步骤: 1.安装VScode:首先,需要在你的电脑上下载和安装VScode,可以在官网上下载 https://code.visualstudio.com/。 2.安装插件:然后,你需要安装一个C/C++插件。打开VScode并点击左侧的扩展选项,搜索 “C++”插件,选择并安装它。 3.配置编译器:为了编译你写的代码,需要安装一个编译器。在这里我们使用MinGW。下载和安装MinGW,设置好环境变量,在系统变量的Path中添加MinGW的bin文件夹路径,这样VScode就可以找到MinGW,通过命令行将文件编译成可执行程序。 4.配置路径:在VScode中配置MinGW路径,在设置中搜索“C++ intelliSense path”,点击“编辑 in settings.json”打开配置文件,添加以下代码: { "C_Cpp.default.intelliSenseMode": "gcc-x64", "C_Cpp.default.compilerPath": "C:\\MinGW\\bin\\g++.exe", "C_Cpp.default.includePath": [ "${workspaceFolder}/**" ] } 5.编写并运行代码:现在VScode和MinGW已经配置好了。创建一个C/C++文件并用VScode打开它,按“Ctrl + Shift + B”编译并运行。编译后将在同一目录下生成.exe文件,如果没有报错,应该能看到程序输出。 总之,VScode是一个强大的编辑器,而且可以方便地安装和配置C/C++环境。尽管这个过程可能需要一些时间和精力,但一旦配置好,你就可以在这个编辑器中愉快地写代码了。 ### 回答3: VS Code 是一个免费、轻量级的开源代码编辑器,它被广泛地用于各种编程任务,包括 C/C++ 开发。本篇文章将介绍如何在 VS Code 中安装和配置 C/C++ 开发环境。 1. 下载并安装 VS Code 首先,需要从 VS Code 官网(https://code.visualstudio.com/)下载并安装 VS Code。 2. 安装 C/C++ 插件 打开 VS Code 后,点击左侧的扩展(Extension)按钮,在搜索框里输入“C/C++”,会出现一些 C/C++ 相关的扩展,选择其中一个然后点击安装。这样就安装了 C/C++ 的插件。在安装完成后,需要重启 VS Code 才能生效。 3. 配置 MinGW 环境 MinGW 是一个在 Windows 上的 C/C++ 开发环境,它是 GNU 工具集的 Windows 版本。在配置 MinGW 前,需要先下载 MinGW 安装器。可以从 MinGW 官网(https://osdn.net/projects/mingw/releases/)下载。 .MINIW 安装和配置 安装完成后,在环境变量中设置 MinGW 的路径。具体操作方法如下: (1)打开“计算机”属性; (2)选择“高级系统设置”,然后选择“环境变量”; (3)在系统变量中选择“path”,然后点击编辑; (4)在新的窗口中添加 MinGW 安装路径,“OK”保存。 4. 配置 tasks.json 文件 在 VS Code 中打开一个工程,然后打开菜单栏的“终端”(Terminal),选择“运行任务”(Run Task),接着选择“配置任务”(Configure Tasks)。这将会在 .vscode 目录下创建一个 tasks.json 文件。此文件包含一个默认的任务,可以依据需要更改。我们可以使用“g++”编译编译 C/C++ 代码。具体配置方法如下: { "version": "2.0.0", "tasks": [ { "label": "build", "type": "shell", "command": "g++", "args": [ "-g", "${fileDirname}/*.cpp", "-o", "${fileDirname}/${fileBasenameNoExtension}.exe" ], "group": { "kind": "build", "isDefault": true } } ] } 上面的配置代码将会在相应的文件夹中编译所有的 cpp 文件,并生成一个可执行文件。如果需要更改编译器或者编译选项,可以根据需要进行更改。 5. 调试 C/C++ 代码 在 VS Code 中可以通过调试器来调试 C/C++ 代码。可以将光标放在 main() 函数的任意行上,然后使用快捷键“F5”启动调试器,也可以点击调试器菜单栏中的“启动调试”按钮进入调试模式。在调试中,可以使用各种功能,包括断点、变量查看等。 总之,安装和配置 C/C++ 开发环境需要先下载并安装 VS Code,在 VS Code 中安装 C/C++ 插件,然后在 Windows 系统中配置 MinGW,最后在 VS Code 中配置 tasks.json 文件即可。另外,还可以在 VS Code 中使用调试器来调试 C/C++ 代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值