该报错是 出现未定义引用"xxx"。是说我们类中的成员函数未定义。出现这种错误的原因是实现成员函数的c/cpp文件未被编译。
1. 在设置中添加所有的编译源文件,能够在编译时自动链接。
2. 添加头文件位置,让编译器能够正确找的头文件。
vs code 是使用插件自动编译,一般运行后目录下会自动生成一个“.vscode”文件,编译文件是该文件下的“tasks.json”文件。
编译指令位在 "args"里。
原本的编译指令为 g++ -g ${file}.c -o ${fileDirname}\\${fileBasenameNoExtension}.exe
等于==> gcc test.c -o test.exe
从上图这可以发现,只包含了test.c文件,并没有包含cJSON.c文件。
所以,为了能够编译完全文件中的源文件,我们需要让所有的源文件都包含进去。
手动编译:
gcc test.c cJsoN.c -o test.exe
编译器自动编译:(参考其他博客)
- 用 " *.c " 代替目录下所有源文件
- "${file}" 换成 "${fileDirname}\\*.c"。
- 这里的 ${fileDirname} 表示当前目录
- cpp文件同理,把 *.c 换成 *.cpp
- 直接把所有的源文件路径包含。
- 把 "${file}" 换成 "${fileDirname}\\cJSON.c","${fileDirname}\\test.c"
代码:
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: gcc.exe 生成活动文件",
"command": "F:\\Program Files (x86)\\mingw64\\bin\\gcc.exe",
"args": [
"-fdiagnostics-color=always",
"-g",
// "${fileDirname}\\*.c",
"${fileDirname}\\cJSON.c","${fileDirname}\\test.c",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}
这个文件, 有时候不会自动生成在“.vscode”中,可以 Ctrl+Shift+p,选择下图的选项,会自动生成,并弹出 c_cpp_properties.json 文件。
设置:
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**",
"E:/graduate/907_code/c++/project/cJSONFiles/cJSON/*" //此处为项目路径
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"compilerPath": "F:\\Program Files (x86)\\mingw64\\bin\\gcc.exe",
"cStandard": "c17",
"cppStandard": "gnu++14",
"intelliSenseMode": "windows-gcc-x64"
}
],
"version": 4
}
当源文件和头文件编译文件修改好后,运行时,发现按右上角的▶符号,添加的源文件参数还是没有变化。(到底为什么,我也没在网上找到解释)
参考其他博主的博客,提到 使用 Shift + Ctrl + B 进行编译,然后再按 F5 运行。可以成功编译运行。
参考:
VSCode编译时提示 undefined reference to “XXX” 问题一列
VSCode C++多文件编译(最简单的方法)_vscodec++多文件编译
VScode C++头文件问题的终极解决办法
【VS code找不到头文件】成功解决 (检测到Include错误,请更新includePath)(明明有头文件,却找不到)_vs为啥一直说include错误