添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
强健的红薯  ·  MFC ...·  1 年前    · 
文质彬彬的手套  ·  Log4j ...·  1 年前    · 
跑龙套的小蝌蚪  ·  objective c - Reading ...·  1 年前    · 

前文对如何部署C/C++编译与调试环境进行了说明;也附带说明了如何对简单的单文件程序进行调试。

那么,对于真实的项目来说绝绝大部分都不止由一个文件构成;都是由多个文件相互调用各施其职分工合作来构成整个项目;在这种情况下如何对项目进行调试呢?

接下来,我们模拟一个简单的多文件项目来进行说明。

原理:多文件的编译需要将所有相关的cpp源码文件都作为参数并输出为.exe文件。

$ g++ main.cpp support.cpp -o main.exe

准备环境

本文在正确完成C/C++单文件调试的基础上进行。

首先我们假设我们的项目有三个文件

  • main.cpp
  • support.cpp
  • support.h

简单介绍一下三个文件的相关内容:

  • main.cpp:程序入口,即包含一个main函数,在main中调用support.cpp的函数
  • support.cpp:support.cpp文件所述函数声明的具体实现(实际的功能性函数的源码)
  • support.h: 函数声明 【本示例中仅写了一个函数来做示范printHello()】

这个简单的工程构成大概就是如此,下面分别是三个文件的源代码:

main.cpp

// cpp 源码文件;我们用来存放main()函数。
// main()函数是C++程序的入口函数;一切的运行从main()开始。
#include "support.h" //包含头文件
#include <iostream>  //包含中最基本的iostream;这是最基本的输入输出模块,C++本身已经实现了我们拿来用即可。
// 如想把std::cout和std::endl简写成cout和endl;则需要在使用前加上:
// using namespace std;
int main(){
    int a = 10;
    int b = 1010;
    std::cout << "计算结果:" << add_num(a, b) << std::endl; //这里调用头文件中申明的函数进行计算。
    system("pause");
    return 0;

support.cpp

// cpp 源码文件;我们这里用来存放已经在.h头文件中申明过的函数主体
// 这些函数其实也可以放在与main()函数所在的.cpp文件中;实际的项目中一般都写在单独的文件中
#include "support.h" // 包含头文件;如果不包含的话,就把头文件中的函数什么直接写在这里也行。
int add_num(int x, int y){
    int z;
    z = x + y;
    return z;
}

support.h

// 头文件
//#include <iostream>
int add_num(int x, int y);  //在头文件申明将要定义的函数(一般定义在单独的cpp文件中)

尝试调试

准备好上面的测试项目源码之后;若直接尝试debug(在下面的界面下按 F5

关于使用VScode进行C/C++项目里多文件的调试_vscode

不出意外会出现以下报错:

The preLaunchTask 'C/C++: g++.exe build active file' terminated with exit code -1.

关于使用VScode进行C/C++项目里多文件的调试_调试_02

原因主要出在tasks.json的配置里;默认tasks.json的配置如下:

{
    "version": "2.0.0",
    "tasks": [
            "type": "cppbuild",
            "label": "C/C++: g++.exe build active file",
            "command": "D:/MinGW/C/mingw64/bin/g++.exe",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",     //默认只有当前文件本身
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            "options": {
                "cwd": "D:/MinGW/C/mingw64/bin"
            "problemMatcher": [
                "$gcc"
            "group": {
                "kind": "build",
                "isDefault": true
            "detail": "compiler: D:/MinGW/C/mingw64/bin/g++.exe"
}

可以看到默认的配置中 args 部分只会为 ${file} 也就是当前文件本身进行编译并输出 .exe 文件。

这与我们实际项目中当前文件还引用了其他的关联文件的实际情况不符,那么就需要将这些关联的 .cpp (除 main.cpp 以外的所有 .cpp 文件)文件在 args 部分都定义出来。

注意:只需要加上 .cpp 的源码文件即可; .h 的头文件不用列出。

根据这个思路,我们将 tasks.json 修改为如下内容并保存。

{
    "version": "2.0.0",
    "tasks": [
            "type": "cppbuild",
            "label": "C/C++: g++.exe build active file",
            "command": "D:/MinGW/C/mingw64/bin/g++.exe",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "${fileDirname}\\support.cpp",   //所有与main.cpp关联的cpp文件都列出;每个一行。
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            "options": {
                "cwd": "D:/MinGW/C/mingw64/bin"
            "problemMatcher": [
                "$gcc"
            "group": {
                "kind": "build",
                "isDefault": true
            "detail": "compiler: D:/MinGW/C/mingw64/bin/g++.exe"
}

然后我们再次打开main.cpp文件并运行调试。

关于使用VScode进行C/C++项目里多文件的调试_头文件_03

可以看到调试过程可以顺利继续帮执行了生成的 main.exe 程序。

关于使用VScode进行C/C++项目里多文件的调试_头文件_04

但是;出现了中文乱码的问题;接下来我们在下一篇介绍解决中文显示乱码的问题。