Vscode C++的基础配置文件以及无法产生可编译文件exe的处理方法(undefined reference)

采用排除法:

1.是否将工作文件夹添加工作区?

打开vscode -》 文件 -》 打开文件夹 -》文件 -》将文件夹添加工作区(或者另存为一个),把工作区文件放到工作文件夹里。

如下:Manager.code-workspace

工作区结构:.vscode文件夹装配置文件,.code-workspace工作区,ManagerSys.h类的声明,ManagerSys.cpp类成员函数(方法)的定义,ManagerSystemMain.cpp主程序

Vscode C++的基础配置文件以及无法产生可编译文件exe的处理方法(undefined reference)_第1张图片


2.基础文件配置?

电脑上编译器是下载的MinGW里面的g++,保存位置在D:/Mingw/mingw64/bin/g++.exe

2.1 配置c_cpp_properties.json文件:

includePath是包含头文件的路径,需要把当前工作文件夹路径加入进去,例如此处添加就是Manager那个路径。

每个工作文件都需要增加自己的

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                
                "${workspaceFolder}/**",
                "D:/Mingw/mingw64/include/**",
                "D:/Mingw/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/**",
                "D:/Mingw/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/backward/**",
                "D:/Mingw/mingw64/include",
                "C:/Users/YHW/Desktop/Ctest/**",
                "C:/Users/YHW/Desktop/Manager/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "compilerPath": "D:\\Mingw\\mingw64\\bin\\g++.exe",
            "cStandard": "c89",
            "cppStandard": "gnu++98",
            "intelliSenseMode": "windows-gcc-x64"
        }
    ],
    "version": 4
}

2.2 配置launch.json文件:这是为了调试的配置

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        
        {
            "name": "gdb 启动器",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/${fileBasenameNoExtension}.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "D:\\Mingw\\mingw64\\bin\\gdb.exe",
            "preLaunchTask": "g++", // prelaunch作用是进行编译
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }

2.3 配置task.json文件:

配置task文件的时候就会出现不同:因为vscode不像VS那样直接就对于工程文件编译,vscode需要在配置中加上链接,通知编译器文件的联系。

注意自己文件和文件夹的名称

第一种情况:只需要编译通过单个cpp文件,其他cpp文件不需要同时编译

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558 
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "type": "cppbuild",
            "label": "g++",
            "command": "D:/Mingw/mingw64/bin/g++.exe",
            "args": [
                "-g",
                //"${workspaceFolder}\\ManagerSys.cpp",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}.exe",
            ],
            "options": {
                "cwd": "D:\\Mingw\\mingw64\\bin\\"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "test",
                "isDefault": true
            },
            "detail": "D:/Mingw/mingw64/bin/g++.exe"
        }
    ]
}

编译时只对目标文件调试即可。(绿色的小箭头开始编译)

Vscode C++的基础配置文件以及无法产生可编译文件exe的处理方法(undefined reference)_第2张图片

 第二种情况:需要编译通过所有cpp文件

Vscode C++的基础配置文件以及无法产生可编译文件exe的处理方法(undefined reference)_第3张图片

 此时task文件需要更改为:

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558 
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "type": "cppbuild",
            "label": "g++",
            "command": "D:/Mingw/mingw64/bin/g++.exe",
            "args": [
                "-g",
                "${workspaceFolder}\\*.cpp", //多文件一起编译
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}.exe",
            ],
            "options": {
                "cwd": "D:\\Mingw\\mingw64\\bin\\"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "test",
                "isDefault": true
            },
            "detail": "D:/Mingw/mingw64/bin/g++.exe"
        }
    ]
}

tasks.json文件中的args参数,实际上就是调用gcc时,后面所跟的参数在初始的配置中,实际上编译器执行的命令为gcc -g XXX.cpp -o XXX.exe,而修改后的配置中,执行的命令是gcc -g XXX.cpp XX.c -o XXX.exe,这是由于参数${file}代表的是被编译的当前文件,而参数${workspaceFolder}\\*.cpp代表的是当前目录下的所有.cpp文件
 

到此结束。


3、错误排除

出现“undefined reference”这种问题

在这里插入图片描述

Vscode C++的基础配置文件以及无法产生可编译文件exe的处理方法(undefined reference)_第4张图片

两种可能:

1.点一下runCode的播放按钮,看看有没有产生exe文件

Vscode C++的基础配置文件以及无法产生可编译文件exe的处理方法(undefined reference)_第5张图片

 2.上面的文件配置是否正确,更改完重启vscode,开始调试。

如果是多文件同时编译,只需要点Main函数的调试步骤即可,头文件和类的声明不需要。

成功之后如图

Vscode C++的基础配置文件以及无法产生可编译文件exe的处理方法(undefined reference)_第6张图片

3.虚构函数导致的内存溢出

出现的是undefined reference: classtest::~classtest,说明基类虚构函数不是虚函数,要加virtual;

或者直接注释掉虚构函数,最后再来调试.

你可能感兴趣的:(c++)