1、问题现象:
下载cJSON.h/cJSON.c 测试cJSON相关函数,只有cJSON.h、cJSON.c 及配套的test.c 三个文件。
1)在code::blocks 中完全正确运行,能看到正确的结果
2)在vscode中点击右上角的三角编译运行,报如下错误,找不到函数:
事实上三个文件就在同一个目录下:
在cJSON.h中有相关函数的声明,比如:
2、问题分析
仔细查看编译时的执行命令(图一顶部),如下图:
从图中的命令可以发现,编译的时候只包含了目录下的 test.c 文件,并没有包含cJSON.c文件。当我们用命令行编译多个源文件时,应该这样编译 gcc file1.c file2.c -o output,这个命令要指定参与编译的源文件,头文件地址,输出及相关参数。说明编译时参数设置是有问题的
3、解决方法
问题是在哪里设置这些需要编译的文件,及参数呢?主要就是在4个jason文件中的下面两个文件中设置,需要注意的地方增加了注释。
1)在tasks.jason 中设置源文件及参数
{
// 有关 tasks.json 格式的文档,请参见
// https://go.microsoft.com/fwlink/?LinkId=733558
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "Compile",
"command": "D:\\mingw64\\bin\\gcc.exe",
"args": [
"-g",
"${workspaceFolder}\\cJSON.c","${workspaceFolder}\\test.c", //此处设置编译需要的源文件,有多个,要分别设置
"-I",
"--std=c11",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
],
"group": {
"kind": "build",
"isDefault": true
},
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "shared",
"showReuseMessage": true,
"clear": false
},
// "options": {
// "cwd": "D:\\mingw64\\bin"
// },
"problemMatcher": [
"$gcc"
],
//"group": "build"
}
]
}
2) 在c_cpp_properties.json 中设置头文件位置
{
"configurations": [
{
"name": "Win32",
"includePath": [
"D:/kkjson/*", //此处是需要的头文件目录位置,有多处则设置多条
"${workspaceFolder}/**"
],
"defines": ["_DEBUG", "UNICODE", "_UNICODE"],
"compilerPath": "D:\\mingw64\\bin\\gcc.exe",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "msvc-x86"
}
],
"version": 4
}
其它两个json文件正常设置即可,与此问题关系不大。
4、验证
设置上述两个jason文件,保存后。
1) 再次点击又上角的三角,发现故障依旧,编译命令行的参数并未变化(如上图1,图2)
2)采用 Shift+Ctrl+B 编译,出现如下图(下图中的main.c 是将test.c 改了文件名,无其它变化)。从这里命令行可以看出需要的cJSON.c文件已经参与编译了。并且编译成功。
3,然后F5运行,可得到正确结果。
从1)与 2)3)对比看,右上角的三角Run Coder并未正确读取到配置文件的配置。