如何配置,这样您就不必在 vscode 的 c 中键入标头的整个路径

How to configure so that you don't have to type the entire path to headers in c in vscode

提问人:Nikolas Rian 提问时间:10/3/2023 更新时间:10/5/2023 访问量:84

问:

我正在使用 vscode 进行测试,以查看它在 c 中编辑代码的能力。我在配置标头路径时遇到了一个问题,为了方便标头导入,因为我将它们放在单独的文件夹中进行组织,因此我配置了 Microsoft C/C++ 扩展以将包含文件夹添加为标头的路径,但似乎不起作用

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/include"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c23",
            "cppStandard": "c++17",
            "intelliSenseMode": "linux-gcc-x64",
            "browse": {
                "path": [
                    "${workspaceFolder}/include",
                    "${workspaceFolder}/src"
                ],
                "limitSymbolsToIncludedHeaders": false,
                "databaseFilename": ""
            }
        }
    ],
    "version": 4
}

这是创建c_cpp_properties文件,但它似乎没有执行任何操作。

我仍然收到这个错误:

Iniciando o build...
/usr/bin/gcc -fdiagnostics-color=always -g /home/user/Codes/C/TestProject/src/*.c -o /home/user/Codes/C/TestProject/src/../output/Main
/home/user/Codes/C/TestProject/src/Main.c:2:10: fatal error: List.h: No such file or directory
    2 | #include "List.h"
      |          ^~~~~~~~
compilation terminated.

Build concluída com erro(s).
c visual-studio-code 配置 头文件

评论

0赞 rioV8 10/3/2023
c_cpp_properties编译时不使用,在编译任务中添加参数-I
0赞 Nikolas Rian 10/3/2023
@rioV8不起作用:/usr/bin/gcc -fdiagnostics-color=always -I -g /home/user/Codes/C/TestProject/src/*.c -o /home/user/Codes/C/TestProject/src/../output/Main /home/user/Codes/C/TestProject/src/Main.c:2:10:致命错误:List.h:没有这样的文件或目录 2 |#include “List.h” |^~~~~~~~ 编译终止。
0赞 rioV8 10/3/2023
您是否考虑过查看 GCC 文档中有关其论点的文档

答:

0赞 Usman Mehmood 10/5/2023 #1

注意

这个答案主要是从我自己对另一个问题的回答中复制的:第一次用 C 语言编译时 VSCode 中的错误

c_cpp_properties.json

c_cpp_properties.jsonVSCode 用于为 Intellisense 提供信息 它需要做一些事情,比如查看文档、查找编译错误和 自动完成。它对实际编译没有影响。

使用 GCC 编译

如果你只有一个 main.c,那么你可以直接将它传递给 GCC,它 将编译不问任何问题。

gcc ./main.c -o program.exe

如果要调试它,则还要告诉GCC使用或添加调试符号,如果要设置优化级别,则传递以下,,或。-g-g3-O0-O1-O3

如果文件夹中有其他文件,其结构如下:

project
 |
 |- library_1
 |   |
 |   |- library_1.h
 |   |- library_1.c
 |
 |- main.c

你可以将这样的东西传递给 GCC。

gcc main.c -I ./my_header library_1/library_1.c -o program.exe

它会编译。但随着文件数量的增加,此命令将 变得非常大,每次在终端上输入它是不切实际的 时间。

使用 CMake

如果你有很多文件,你可以使用 CMake 来管理构建和传递 自动将东西发送到 GCC。一个简单的 CMakeLists.txt 类似于 这。

# Tell CMake about your project name and version etc
cmake_minimum_required(VERSION 3.19)
set(PROJECT_NAME "your_project")
project(${PROJECT_NAME} VERSION 0.1 LANGUAGES C CXX)

# Add your executable and attach it to main.c
add_executable(${PROJECT_NAME} main.c)

# Add your library folders
add_subdirectory(library_1)
add_subdirectory(library_2)
add_subdirectory(library_3)
add_subdirectory(library_4)

但请记住,每个库文件夹也会有一个 CMakeLists.txt。 就我个人而言,我喜欢用库名称制作一个文件夹,制作一个 .c 和 .h 文件 同名。喜欢这个。

library_1
  |- library_1.h
  |- library_1.c
  |- CMakeLists.txt

然后把它放在 cmake 中。library_1

get_filename_component(CURRENT_DIR_NAME ${CMAKE_CURRENT_LIST_DIR} NAME)
target_sources(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/${CURRENT_DIR_NAME}.c)
target_include_directories(${PROJECT_NAME} PRIVATE .)

它会自动选取库名称以及 .c 和 .h 文件名,因此 只需将其复制粘贴到您的所有库中即可。

然后你可以像这样构建

cmake -G Ninja -B build
ninja -C build

它会将可执行文件放在文件夹中。build

VSCode 扩展

我正在开发一个 VSCode 扩展,它可以为您完成所有这些步骤,并且 创建预配置的 CMake 项目。它还提供用于清洁的按钮, 构建、运行、调试和测试这些项目,这样您就不必这样做了 一次又一次地处理终端。它还会检查缺少的构建 工具,因此用户不必处理安装和配置。

我称之为 C 工具包

顾名思义,它只用 C 语言创建预配置项目,而不是 C++。 但是您可以创建项目并重命名文件,它可能会起作用 想。Lemme 知道您是否决定使用它以及它是否解决了您的问题。