【解决】VSCode编写C++自定义头文件undefined reference异常问题
最近在使用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文件。程序就执行通过了。
更多推荐
所有评论(0)