最近在使用VSCode编写C++程序过程中,自定义一个 *.h 文件,其中包含了函数声明,在主函数中引入头文件后,调用头文件对应C++文件中的方法,出现了undefined reference问题,这个主要是配置没有正确造成的,具体解决方法如下:

文件具体目录如下:

即头文件夹和cpp文件不在同一个文件夹下

在这里插入图片描述

主函数相关代码如下:

主函数:hello.cpp

#include<iostream>
using namespace std;
#include ".\test01\.vscode\head\swap.h"

int main(){
    int a=5,b=6;
    //此为调用头文件中对应的函数
    swap(a,b);
    //cout<<"the min"<<min<<endl;
    system("pause");
    return 0;
}

头文件:swap.h

#include<iostream>
using namespace std;

void swap(int a,int b);

头文件所对应的cpp文件

#include ".\test01\.vscode\head\swap.h"

void swap(int a,int b){
    int tmp=a;
    a=b;
    b=tmp;
    cout<<"a="<<a<<endl;
    cout<<"b="<<b<<endl;
}
分析问题出现原因

在代码的编译过程中,可以看一下 VSCode终端下面的编译情况,则发现是因为 swap 没有找到,且没生成 swap.exe 文件,这个主要是 c++ 对应的配置文件的问题,这里我们需要打开 task.json 文件,即目标执行文件

Tips:如果您的目录下没有tasks.json 文件,需要在VSCode工程界面中,按压Ctrl+Shift+p,在弹出的输入框中,输入Tasks后,从提示选单中选择Configure Task,再选择C/C++:gcc.exe build active file,即可在根目录生成 tasks.json 文件,文件的具体内容如下:

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++.exe 生成活动文件",
            "command": "your g++path\\mingw64\\bin\\g++.exe",
            "args": [
                "-fdiagnostics-color=always",
                "-g", 
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "调试器生成的任务。"
        }
    ],
    "version": "2.0.0"
}

这里需要按注意的是tasks.json文件中的args参数,实际上就是调用gcc时,后面所跟的参数在初始的配置中,实际上编译器执行的命令为gcc -g hello.cpp -o hello.exe,即只会编译主函数对应的文件,不会编译其他的cpp文件;
而我们需要修改这个配置。具体修改过程如下:

将上面 args 参数中的 “ f i l e " , − > " {file}", - > " file",>"{fileDirname}\*.cpp”,

即改完后的 tasks.json为:

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++.exe 生成活动文件",
           "command": "your g++path\\mingw64\\bin\\g++.exe",
            "args": [
                "-fdiagnostics-color=always",
                "-g", 
                "${fileDirname}\\*.cpp",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "调试器生成的任务。"
        }
    ],
    "version": "2.0.0"
}

修改后的配置中,则在编译器中,可以看到,执行的命令是gcc -g hello.cpp swap.cpp -o hello.exe swap.exe,这是由于参数 f i l e 代 表 的 是 被 编 译 的 当 前 文 件 , 而 参 数 {file} 代表的是被编译的当前文件,而参数 file{fileDirname}\*.cpp 代表的是当前目录下的所有.cpp文件。程序就执行通过了。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐