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源文件,这会编译所有的编译模块,问题解决!

相关推荐
如意.7592 小时前
【Linux开发工具实战】Git、GDB与CGDB从入门到精通
linux·运维·git
Thera7773 小时前
C++ 高性能时间轮定时器:从单例设计到 Linux timerfd 深度优化
linux·开发语言·c++
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ4 小时前
Linux 查询某进程文件所在路径 命令
linux·运维·服务器
君义_noip4 小时前
信息学奥赛一本通 1952:【10NOIP普及组】三国游戏 | 洛谷 P1199 [NOIP 2010 普及组] 三国游戏
c++·信息学奥赛·csp-s
旖-旎5 小时前
二分查找(x的平方根)(4)
c++·算法·二分查找·力扣·双指针
顶点多余5 小时前
使用C/C++语言链接Mysql详解
数据库·c++·mysql
汉克老师5 小时前
GESP2026年3月认证C++四级( 第二部分判断题(1-10))
c++·指针·函数重载·文件操作·数组·gesp4级·gesp四级
安当加密5 小时前
无需改 PAM!轻量级 RADIUS + ASP身份认证系统 实现 Linux 登录双因子认证
linux·运维·服务器
内卷焦虑人士6 小时前
Windows安装WSL2+Ubuntu 22.04
linux·windows·ubuntu
khddvbe6 小时前
C++并发编程中的死锁避免
开发语言·c++·算法