在vs code中调试编译有多个.c或.cpp文件的项目,报错undefined reference to “xxx“(cJSON小项目为例)

项目下载链接:https://sourceforge.net/projects/cjson/

项目主要文件:cJSON.c、cJSON.h、test.c

在vs code中调试编译有多个.c或.cpp文件的项目,报错undefined reference to “xxx“(cJSON小项目为例)_第1张图片


问题点:

  • 有完整的头文件但编译时找不到,一直报 undefined reference to "xxx"。

在vs code中调试编译有多个.c或.cpp文件的项目,报错undefined reference to “xxx“(cJSON小项目为例)_第2张图片

报错原因:按单文件编译方法对多文件进行编译

该报错是 出现未定义引用"xxx"。是说我们类中的成员函数未定义。出现这种错误的原因是实现成员函数的c/cpp文件未被编译。


 解决方法

1. 在设置中添加所有的编译源文件,能够在编译时自动链接。

2. 添加头文件位置,让编译器能够正确找的头文件。

1、在 tasks.jason 中设置源文件

vs code 是使用插件自动编译,一般运行后目录下会自动生成一个“.vscode”文件,编译文件是该文件下的“tasks.json”文件。

编译指令位在 "args"里。

原本的编译指令为 g++   -g   ${file}.c   -o  ${fileDirname}\\${fileBasenameNoExtension}.exe

等于==> gcc test.c  -o test.exe

在vs code中调试编译有多个.c或.cpp文件的项目,报错undefined reference to “xxx“(cJSON小项目为例)_第3张图片

从上图这可以发现,只包含了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"

 代码:

在vs code中调试编译有多个.c或.cpp文件的项目,报错undefined reference to “xxx“(cJSON小项目为例)_第4张图片

{
    "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"
}

 2、在 c_cpp_properties.json 设置头文件位置

这个文件, 有时候不会自动生成在“.vscode”中,可以 Ctrl+Shift+p,选择下图的选项,会自动生成,并弹出 c_cpp_properties.json 文件。

在vs code中调试编译有多个.c或.cpp文件的项目,报错undefined reference to “xxx“(cJSON小项目为例)_第5张图片

 设置:

在vs code中调试编译有多个.c或.cpp文件的项目,报错undefined reference to “xxx“(cJSON小项目为例)_第6张图片

{
    "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错误

你可能感兴趣的:(c++)