在Visual Studio Code中正确链接.cpp文件并解决编译未定义引用错误
在VS Code中编译C++项目时的链接错误解决方法
问题场景
编译C++项目时出现链接错误,错误信息如下:
[main.cpp 2023-04-05 04:55:22.517] ,,C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\MyName\AppData\Local\Temp\ccWOnMhK.o:main.cpp:(.text+0x18): undefined reference to `Aux_main::Aux_main()' collect2.exe: error: ld returned 1 exit status
项目包含以下文件:
- main.cpp
- Aux_main.h
- Aux_main.cpp
- Pessoa.cpp
- Pessoa.h
各文件代码如下:
main.cpp
int main(){ Aux_main Objeto_Aux_main; return 0; }
Aux_main.h
#include "Pessoa.h" #ifndef AUX_MAIN_H #define AUX_MAIN_H class Aux_main{ private: Pessoa Einstein; Pessoa Newton; int diaAtual, mesAtual, anoAtual; public: Aux_main(); void Executar(); }; #endif
Aux_main.cpp
#include "Aux_main.h" Aux_main::Aux_main(){ Einstein.Inicializa(14,3,1879, "Albert Einstein"); Newton.Inicializa(4,1,1643, "Isaac Newton"); std::cout << "Informe o dia/mes/ano." << endl; std::cin >> diaAtual >> mesAtual >> anoAtual; Executar(); } void Aux_main::Executar(){ Einstein.CalcIdade(diaAtual,mesAtual,anoAtual); Newton.CalcIdade(diaAtual,mesAtual,anoAtual); }
Pessoa.cpp
#include "Pessoa.h" using namespace std; #include <iostream> using std::cout; using std::endl; Pessoa::Pessoa(int diaN, int mesN, int anoN, const char* nomeN){ Inicializa(diaN, mesN, anoN); } Pessoa::Pessoa(){ Inicializa(0,0,0); } void Pessoa::Inicializa(int diaN, int mesN, int anoN, const char* nomeN){ dia = diaN; mes = mesN; ano = anoN; idade = -1; strcpy(nome, nomeN); } void Pessoa::CalcIdade(int ano_atual, int mes_atual, int dia_atual){ idade = ano_atual - ano; if(mes_atual<mes){ idade--; } else if(mes_atual==mes){ if(dia_atual<dia){ idade--; } } cout << "A idades de " << nome << " no ano de 2023 seria de " << idade << " anos.\n" << endl; } int Pessoa::getIdade(){ return idade; }
Pessoa.h
#include <stdio.h> #include <string.h> #include <iostream> using std::cout; using std::endl; #ifndef PESSOA_H #define PESSOA_H class Pessoa{ private: int dia, mes, ano, idade; char nome[30]; public: Pessoa(int diaN, int mesN, int anoN, const char* nomeN = ""); Pessoa(); void Inicializa(int diaN, int mesN, int anoN, const char* nomeN = ""); void CalcIdade(int ano_atual, int mes_atual, int dia_atual); int getIdade(); }; #endif
解决方法
链接错误的核心原因是编译时仅处理了main.cpp,未将Aux_main.cpp和Pessoa.cpp的实现文件纳入编译链接流程,导致编译器找不到类的具体实现代码。以下是两种在VS Code中正确编译链接的方式:
方式1:直接使用g++命令行
打开VS Code终端(快捷键`Ctrl+``),进入项目所在目录,执行以下命令:
g++ main.cpp Aux_main.cpp Pessoa.cpp -o main.exe
执行完成后,生成的main.exe即为可执行文件,直接运行即可。
方式2:配置VS Code的tasks.json
- 按下
Ctrl+Shift+B,选择"创建tasks.json文件",再选择"g++ - 生成活动文件"。 - 将生成的tasks.json内容替换为以下配置:
{ "version": "2.0.0", "tasks": [ { "type": "cppbuild", "label": "C/C++: g++.exe 生成活动文件", "command": "C:/msys64/ucrt64/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": "编译器: C:/msys64/ucrt64/bin/g++.exe" } ] }
注意:若你的g++安装路径与上述不同,需修改command和detail中的路径为实际路径。
3. 保存配置后,再次按下Ctrl+Shift+B,即可自动编译所有.cpp文件并生成可执行文件。
额外代码修正
Aux_main.cpp中使用了std::cout和std::cin但未包含<iostream>头文件,需在文件顶部添加:
#include <iostream>
否则编译时会出现未定义标识符的错误。
内容的提问来源于stack exchange,提问作者arnf
相关产品推荐
相关产品推荐

