VSCode c++ task.json 包含路径和库
Posted
技术标签:
【中文标题】VSCode c++ task.json 包含路径和库【英文标题】:VSCode c++ task.json include path and libraries 【发布时间】:2018-10-20 21:04:36 【问题描述】:IntelliSense 使用 c_cpp_properties.json >> includePath 来查找自动完成的标头,但我注意到我仍然需要在 task.json >> tasks >> args 中指定包含路径来构建。
我在文档中发现 includePath 与我在“-I”中指定的路径几乎相同:
您为此设置指定的路径与您指定的路径相同 您将通过 -I 开关发送到您的编译器。当你的来源 文件被解析后,IntelliSense 引擎会将这些路径添加到 #include 指令指定的文件,同时尝试 解决它们。不会递归搜索这些路径。*
link
-
我是否通过在构建任务的 args 中指定所有库和包含目录来正确设置 VSCode?还是应该以不同的方式完成?
谁能用不同的词解释 includePath 和 browse 之间有什么区别?解释链接对我来说并不完全清楚
这是我的 c_cpp_properties.json 的示例:
"configurations": [
"name": "Win32",
"includePath": [
"$workspaceFolder/**",
"D:/github/dependencies/SDL2-2.0.8/include"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"compilerPath": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin\\g++.exe",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "clang-x64",
"browse":
"path": [
"$workspaceFolder/**"
]
],
"version": 4
和task.json:
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
"label": "build",
"type": "shell",
"command": "g++",
"args": [
"-g",
"main2.cpp",
"-ID:\\github\\dependencies\\SDL2-2.0.8\\include",
"-LD:\\github\\dependencies\\SDL2-2.0.8\\lib\\x64",
"-lSDL2main","-lSDL2", "-lopengl32",
"-o",
"test-sdl"
]
],
"group":
"kind": "build",
"isDefault": true
,
"problemMatcher":"$gcc"
是一个简单的问题,但我是 VSCode 的新手(抱歉)。
【问题讨论】:
我有同样的情况,问同样的问题。如果你找到了解释,请分享,谢谢:) 这能回答你的问题吗? #include errors detected in vscode 【参考方案1】:1。我是否正确设置了 VSCode?h3>
主要是。您必须两次指定包含路径(一次在c_cpp_properties.json
中,再次在描述您的构建的文件中)这一事实是不可避免的。在 VSCode 中,构建系统和编辑器互不理解,都需要这些信息。相比之下,使用 Visual Studio(没有“代码”),只需要指定一次路径;这是使用“真正的”集成开发环境的好处之一。 (但也有缺点;我并不是要阻止您使用 VSCode。)
但是,我不建议将包含路径直接放入tasks.json
。相反,通常有一个单独的构建系统,可以从命令行调用,然后tasks.json
也调用该命令。
作为一个非常常见的示例,您可以使用 GNU Make 并将当前的 tasks.json
替换为这个(未经测试!)Makefile:
test-sdl: main2.cpp
g++ -g main2.cpp -ID:\\github\\dependencies\\SDL2-2.0.8\\include -LD:\\github\\dependencies\\SDL2-2.0.8\\lib\\x64 -lSDL2main -lSDL2 -lopengl32 -o test-sdl
这告诉make
如何从main2.cpp
构建test-sdl
,即通过运行所示的g++
命令。 (我故意让这个 Makefile 保持非常简单,因为问题与 Makefile 无关;请注意,真正的 Makefile 会为了更好的组织而分解,并且反斜杠可能需要调整。)
无论如何,您的tasks.json
简化为:
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
"label": "build",
"type": "shell",
"command": "make", // <-- changed
"args": [] // <-- changed
],
"group":
"kind": "build",
"isDefault": true
,
"problemMatcher":"$gcc"
这更好,因为您没有将重要的构建信息锁定在只有 VSCode 才能理解的文件中。
2。谁能解释一下... includePath 和浏览?
VSCode 有两种不同的系统来理解 C++ 代码。有旧的“标签解析器”,它使用browse.path
,和新的“智能感知”,它使用includePath
。在这一点上(2019-08-30,VSCode 1.37.1),我的理解基本上每个人都应该使用更新的 Intellisense 系统,因为它提供了更准确的信息,并且至少应该是成熟的。因此,您应该能够简单地忽略 browse.path
。
为确保您使用的是 Intellisense 而不是 Tag Parser,请进入 File → Preferences → Settings → C/C++ → “C_Cpp: Intelli Sense Engine”并确保它是“Default”而不是“Tag Parser”。请注意,此设置存储在settings.json
而不是c_cpp_properties.json
。
【讨论】:
【参考方案2】:我也尝试过使用库,至少现在可以使用(顺便说一句,我在 Windows 上): 在 c_cpp_properties.json 中,我有一个对包含目录的引用:
"configurations": [
"name": "Win32",
"includePath": [
"C:\\ProgrammingLibraries\\SDL2-2.0.10\\include\\SDL2",
"$workspaceFolder\\src\\include"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"compilerPath": "C:\\mingw-w64\\x86_64-8.1.0-win32-seh-rt_v6-rev0\\mingw64\\bin\\gcc.exe",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "gcc-x64"
],
"version": 4
在 tasks.json 中,我有一个编译和一个链接器任务,以及一个同时运行的任务:
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
"label": "Compiler",
"type": "shell",
"command": "g++",
"args": [
"-c",
"$workspaceFolder\\src\\main.cpp",
"-IC:\\ProgrammingLibraries\\SDL2-2.0.10\\include\\SDL2"
]
,
"label": "Linker",
"type": "shell",
"command": "g++",
"args": [
"$workspaceFolder\\main.o",
"-o",
"$workspaceFolder\\bin\\HelloSDL.exe",
"-LC:\\ProgrammingLibraries\\SDL2-2.0.10\\lib",
"-lmingw32",
"-lSDL2main",
"-lSDL2"
]
,
"label": "Build HelloSDL",
"dependsOn": [
"Compiler",
"Linker"
],
"group":
"kind": "build",
"isDefault": true
]
【讨论】:
我尝试了这种方法,它似乎有效。我遇到的唯一问题是,如果您在最后一个任务中声明所有依赖项,它们将并行执行,因此有时您最终会链接以前构建的 .o 文件。我建议只在最后一个任务中声明“链接器”依赖项,在“链接器”任务中声明“编译器”依赖项。这样,链接器就会等待编译器真正完成工作。【参考方案3】:我也是 VS Code 的新手。此外,我从未构建过更大的 C++ 项目。至少现在,我这样解决了这座建筑。 (见下文)
我最终在我的 tasks.json
中这样做了 "tasks": [
"type": "shell",
"label": "g++ build active file",
"command": "$workspaceFolder/buildMysorcery.sh",
"options":
"cwd": "/usr/bin"
,
(似乎您无法在 args 属性中转义空格,https://github.com/Microsoft/vscode/issues/36733),
我删除了 args 属性并将命令属性设置为运行一个脚本(buildMysorcery.sh),它只是这样做
#!/bin/bash
g++ fullpathtodir/hello.cpp -Wall -g $(sdl2-config --cflags --libs) -o fullpathtodir/hello
用你的路径替换 fullpathtodir。
【讨论】:
【参考方案4】:这就是我在 Mac(MacBook Pro 2015,macOS Catalina)上的 VS Code 中使用 clang 包含 OpenGL“GLWF”和“glad”库的方式。而且我有智能感知,可以构建和调试。
include/glad/glad.h
- 要包含的库文件
src/helloworld.cpp - 主文件
/* Ask for an OpenGL Core Context */
#define GLFW_INCLUDE_GLCOREARB
#include <GLFW/glfw3.h>
#include <glad/glad.h>
#define BUFFER_OFFSET(i) ((char *)NULL + (i))
int main(int argc, char **argv)
GLFWwindow *window;
/* Initialize the library */
if (!glfwInit())
return -1;
#ifdef __APPLE__
/* We need to explicitly ask for a 3.2 context on OS X */
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#endif
/* Create a windowed mode window and its OpenGL context */
window = glfwCreateWindow(1280, 720, "Hello World", NULL, NULL);
if (!window)
glfwTerminate();
return -1;
/* Make the window's context current */
glfwMakeContextCurrent(window);
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
/* Render here */
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear the buffers
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
glfwTerminate();
return 0;
.vscode/c_cpp_properties.json
"configurations": [
"name": "Mac",
"includePath": ["$workspaceFolder/src/", "$workspaceFolder/include/"],
"defines": [],
"macFrameworkPath": [
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks"
],
"compilerPath": "/usr/bin/clang",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "$default",
"browse":
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
],
"version": 4
.vscode/launch.json
"version": "0.2.0",
"configurations": [
"name": "(lldb) Launch",
"type": "lldb",
"request": "launch",
"program": "$workspaceFolder/build/helloworld.out",
"args": [],
"cwd": "$workspaceFolder"
]
.vscode/tasks.json(需要包含实现文件include/glad.c
,不仅是headers)
"version": "2.0.0",
"tasks": [
"label": "Build with Clang",
"type": "shell",
"command": "clang++",
"args": [
"-std=c++17",
"-stdlib=libc++",
"-lglfw3",
"--include-directory=include/",
"--include=include/glad.c",
"-framework",
"OpenGL",
"-framework",
"IOKit",
"-framework",
"Cocoa",
"src/helloworld.cpp",
"-o",
"build/helloworld.out",
"--debug"
],
"group":
"kind": "build",
"isDefault": true
]
【讨论】:
以上是关于VSCode c++ task.json 包含路径和库的主要内容,如果未能解决你的问题,请参考以下文章
ubuntu下vscode调试c++怎么配置launch.json和task.json
vscode运行python 配置task.json问题求解