code编译时报错undefined reference to ...

问题描述:

我是在Windows10平台使用vscode编译代码时出现的这个问题,一共有三个文件,json.h、json.cpp,example.cpp。json.h负责函数的声明,json.cpp负责函数的实现,example.cpp负责测试代码的正确性。但是在编译时报错undefined reference to...。

问题原因:

vscode使用gcc/g++来编译代码,编译报错`undefined reference to`是由于在链接的时候无法找到函数的说明。

简而言之就是没有编译json.cpp文件,.cpp文件是编译模块,example.cpp通过预处理、编译、汇编后到了链接的阶段,在这之前json.cpp应该作为另一个编译模块生成了.o文件,之后链接的阶段将example.o中对json.cpp中函数的引用符号换成json.cpp的函数入口地址。但是由于没有对json.cpp进行编译,因此造成了`undefined reference to`,也就是链接阶段找不到这个函数入口地址。

解决办法:

在Linux中,当需要编译多个模块时需要把所有的cpp文件罗列出来,例如下面:

g++ -o example -g example.cpp json.cpp

而vscode中tasks.json文件负责设置编译参数 ,我的原始参数设置如下:

{

"tasks": [

{

"type": "cppbuild",

"label": "C/C++: g++.exe build active file",

"command": "D:\\MSYS2\\mingw64\\bin\\g++.exe",

"args": [

"-fdiagnostics-color=always",

"-g",

// "${fileDirname}\\*.c", //build c

"${file}", //build c++

"-o",

"{fileDirname}\\\\{fileBasenameNoExtension}.exe"

],

"options": {

"cwd": "${fileDirname}"

},

"problemMatcher": [

"$gcc"

],

"group": {

"kind": "build",

"isDefault": true

},

"detail": "Task generated by Debugger."

}

],

"version": "2.0.0"

}

我们注意下面这行:

"${file}", //build c++

这个的意思很明显,就是只编译当前打开的文件,我当前打开的是example.cpp,因此只编译example.cpp文件,并没有编译json.cpp文件,这样在链接时当然报错undefined reference to。

解决办法就是将json.cpp一并编译,将上述参数设置修改如下:

"${fileDirname}/*.cpp",

这个参数设置是编译当前文件夹下所有的以.cpp为后缀的文件,也就是编译所有的.cpp源文件,这会编译所有的编译模块,问题解决!

相关推荐
Yupureki1 分钟前
《算法竞赛从入门到国奖》算法基础:入门篇-离散化
c语言·数据结构·c++·算法·visual studio
散峰而望3 分钟前
OJ 题目的做题模式和相关报错情况
java·c语言·数据结构·c++·vscode·算法·visual studio code
无垠的广袤5 分钟前
【工业树莓派 CM0 NANO 单板计算机】YOLO26 部署方案
linux·python·opencv·yolo·树莓派·目标识别
疋瓞7 分钟前
C/C++查缺补漏《5》_智能指针、C和C++中的数组、指针、函数对比、C和C++中内存分配概览
java·c语言·c++
闻林禹10 分钟前
c++并发编程
开发语言·c++
CTO Plus技术服务中14 分钟前
一栈式、系统性的C、C++、Go、网络安全、Linux运维开发笔记和面试笔记
c++·web安全·golang
zc.ovo15 分钟前
线段树优化建图
数据结构·c++·算法·图论
WaWaJie_Ngen16 分钟前
C++实现一笔画游戏
c++·算法·游戏·游戏程序·课程设计
小尧嵌入式19 分钟前
【Linux开发一】类间相互使用|继承类和构造写法|虚函数实现多态|五子棋游戏|整数相除混合小数|括号使用|最长问题
开发语言·c++·算法·游戏
皮蛋sol周20 分钟前
嵌入式学习数据结构(二)双向链表 内核链表
linux·数据结构·学习·嵌入式·arm·双向链表