• 【解决】VSCode编写C++自定义头文件undefined reference异常问题


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

    文件具体目录如下:

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

    在这里插入图片描述

    主函数相关代码如下:

    主函数:hello.cpp

    #include
    using namespace std;
    #include ".\test01\.vscode\head\swap.h"
    
    int main(){
        int a=5,b=6;
        //此为调用头文件中对应的函数
        swap(a,b);
        //cout<<"the min"<
        system("pause");
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    头文件:swap.h

    #include
    using namespace std;
    
    void swap(int a,int b);
    
    • 1
    • 2
    • 3
    • 4

    头文件所对应的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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    分析问题出现原因

    在代码的编译过程中,可以看一下 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"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    这里需要按注意的是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"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

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

  • 相关阅读:
    【C++】入门(上)
    c++ 信奥赛编程 2050:【例5.20】字串包含
    一个无经验的大学毕业生,可以转行做软件测试吗?我的真实案例
    Python函数绘图与高等代数互融实例(三):设置X|Y轴文本标签|网格线
    uniapp中使用render.js进行openers、arcgis等地图操作
    mapboxgl 渲染热力图并动态更新
    Canal增量订阅MySQL数据同步工具
    谷歌浏览器翻译插件,扩展程序,页面右键翻译
    java面试清单和书籍推荐 五颗星五颗星
    轴承寿命预测的基础-对Palmgren理论的再讨论
  • 原文地址:https://blog.csdn.net/qq_29750461/article/details/127972046