无法在 VS Code for C++ 中设置包含路径

Not able set include path in VS Code for C++

我是 VS Code 和 C++ 的新手,运行遇到了一个奇怪的问题。我到处搜索但无法解决。我包括了我自己的 src/include 文件夹中的一个文件。我确实遇到了致命错误,但是如果我手动将包含路径添加到 Makefile 中,代码编译得很好!不知何故,我无法为预处理步骤正确设置路径,但在编译时一切正常。下面是编译输出和其他结构的片段:

**$ make**
src/main2.cpp:1:10: fatal error: 'main2.h' file not found
#include "main2.h"
         ^~~~~~~~~
1 error generated.
src/main.cpp:2:10: fatal error: 'main2.h' file not found
#include "main2.h"
         ^~~~~~~~~
1 error generated.
g++ -Isrc/include -g -O0 -Wall -Wextra -Wshadow -Wnon-virtual-dtor -pedantic -o obj/main.o -c src/main.cpp
g++ -Isrc/include -g -O0 -Wall -Wextra -Wshadow -Wnon-virtual-dtor -pedantic -o obj/main2.o -c src/main2.cpp
g++ -g -O0 -Wall -Wextra -Wshadow -Wnon-virtual-dtor -pedantic -o myapp obj/main.o obj/main2.o 

**$ ./myapp** 
Hello, world!
Inside test!!

**src/main.cpp**

#include <iostream>
#include "main2.h"

int main() 
{
    std::cout<<"Hello, world!" << std::endl;
    test();
    return 0;
}

**src/main2.cpp**

#include "main2.h"
#include <iostream>

void test(void)
{
    std::cout<<"Inside test!!"<<std::endl;
}

**src/include/main2.h**

#ifndef MAIN2_H
#define MAIN2_H

#include <iostream>

void test(void);

#endif

如果我不在我的 Makefile 中添加以下行,那么我将无法 运行 并像以前那样构建。步骤

INC=-I$(SRCDIR)/include

# Building rule for .o files and its .c/.cpp in combination with all .h
$(OBJDIR)/%.o: $(SRCDIR)/%$(EXT)
    $(CC) $(INC) $(CXXFLAGS) -o $@ -c $<

$ make
src/main2.cpp:1:10: fatal error: 'main2.h' file not found
#include "main2.h"
         ^~~~~~~~~
1 error generated.
src/main.cpp:2:10: fatal error: 'main2.h' file not found
#include "main2.h"
         ^~~~~~~~~
1 error generated.
g++  -g -O0 -Wall -Wextra -Wshadow -Wnon-virtual-dtor -pedantic -o obj/main.o -c src/main.cpp
src/main.cpp:2:10: fatal error: 'main2.h' file not found
#include "main2.h"
         ^~~~~~~~~
1 error generated.
make: *** [obj/main.o] Error 1

现在我确实在 c_cpp_properties.json 和全局 settings.json 中添加了很多东西,如下所示,但似乎没有任何效果!

c_cpp_properties.json

{
  "configurations": [
    {
      "name": "macos-gcc-x64",
      "includePath": [
        "${workspaceFolder}/**",
        "${workspaceRoot}/**",
        "${default}"
      ],
      "compilerPath": "/usr/bin/clang",
      "cStandard": "${default}",
      "cppStandard": "c++11",
      "intelliSenseMode": "macos-gcc-x64",
      "compilerArgs": [
        "-Wall",
        "-Wextra",
        "-Wpedantic"
      ],
      "browse": {
        "path": [
            "${workspaceRoot}",
            "${workspaceFolder}"
        ],
        "limitSymbolsToIncludedHeaders": true,
        "databaseFilename": ""
    }
    }
  ],
  "version": 4
}

settings.json

    "C_Cpp.default.includePath": [
        "${default}",
        "${workspaceRoot}/src/include",
        "${workspaceFolder}/**"
    ],
    "C_Cpp.default.forcedInclude": [ "{default}", "${workspaceRoot}/**" ]

我正在 Mac OS 上使用 VS Code!在这方面将不胜感激。

下面是我的 makefile

########################################################################
####################### Makefile Template ##############################
########################################################################

# Compiler settings - Can be customized.
CC = g++
CXXFLAGS = -g -O0 -std=c++11 -Wall -Wextra -Wshadow -Wnon-virtual-dtor -pedantic
LDFLAGS = 

# Makefile settings - Can be customized.
APPNAME = myapp
EXT = .cpp
SRCDIR = src
OBJDIR = obj

############## Do not change anything from here downwards! #############
SRC = $(wildcard $(SRCDIR)/*$(EXT))
OBJ = $(SRC:$(SRCDIR)/%$(EXT)=$(OBJDIR)/%.o)
DEP = $(OBJ:$(OBJDIR)/%.o=%.d)
# UNIX-based OS variables & settings
RM = rm
DELOBJ = $(OBJ)
# Windows OS variables & settings
DEL = del
EXE = .exe
WDELOBJ = $(SRC:$(SRCDIR)/%$(EXT)=$(OBJDIR)\%.o)

INC=-I$(SRCDIR)/include


########################################################################
####################### Targets beginning here #########################
########################################################################

all: $(APPNAME)

# Builds the app
$(APPNAME): $(OBJ)
    $(CC) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)

# Creates the dependecy rules
%.d: $(SRCDIR)/%$(EXT)
    @$(CPP) $(CFLAGS) $< -MM -MT $(@:%.d=$(OBJDIR)/%.o) >$@

# Includes all .h files
-include $(DEP) 



# Building rule for .o files and its .c/.cpp in combination with all .h
$(OBJDIR)/%.o: $(SRCDIR)/%$(EXT)
    $(CC) $(INC) $(CXXFLAGS) -o $@ -c $<

################### Cleaning rules for Unix-based OS ###################
# Cleans complete project
.PHONY: clean
clean:
    $(RM) $(DELOBJ) $(DEP) $(APPNAME)

# Cleans only all files with the extension .d
.PHONY: cleandep
cleandep:
    $(RM) $(DEP)

#################### Cleaning rules for Windows OS #####################
# Cleans complete project
.PHONY: cleanw
cleanw:
    $(DEL) $(WDELOBJ) $(DEP) $(APPNAME)$(EXE)

# Cleans only all files with the extension .d
.PHONY: cleandepw
cleandepw:
    $(DEL) $(DEP)

你的问题在这里:

%.d: $(SRCDIR)/%$(EXT)
        @$(CPP) $(CFLAGS) $< -MM -MT $(@:%.d=$(OBJDIR)/%.o) >$@

首先,我建议您根本不要在任何(重要的)规则前加上 @ 前缀,或者至少在 之前不要这样做 您的 makefile 完全可以工作。通过禁用此输出,您破坏了查看问题的最佳和最简单的方法。如果您没有此 @ 隐藏命令行,您可能会立即看到您的错误。

其次,您不应该在这里使用 CPP:那是 C 预处理器。第三,您不应在此处使用 CFLAGS,因为这些是 C 编译器标志,而您正在编译 C++ 代码。第四,生成依赖文件时使用的标志与编译代码时使用的标志不同总是错误的:这会导致依赖文件不匹配等各种奇怪的问题。

特别是这里你的编译行是这样的:

$(OBJDIR)/%.o: $(SRCDIR)/%$(EXT)
        $(CC) $(INC) $(CXXFLAGS) -o $@ -c $<

其中 (a) 使用不同的编译器,并且 (b) 包括一个额外的变量 INC,它显示在哪里可以找到头文件......果然这些丢失的头文件正是你得到一个错误。

其他注意事项:CC 变量传统上包含 C 编译器;您正在编译 C++,因此您应该使用 CXX 变量。预处理器选项传统上保存在 CPPFLAGS 变量中,而不是 INC.

我会做出这些改变:

# Compiler settings - Can be customized.
CXX = g++
CXXFLAGS = -g -O0 -std=c++11 -Wall -Wextra -Wshadow -Wnon-virtual-dtor -pedantic
  ...

############## Do not change anything from here downwards! #############
  ...
CPPFLAGS = -I$(SRCDIR)/include
  ...
# Creates the dependecy rules
%.d: $(SRCDIR)/%$(EXT)
        $(CXX) $(CPPFLAGS) $(CXXFLAGS) $< -MM -MT $(@:%.d=$(OBJDIR)/%.o) >$@
  ...
$(OBJDIR)/%.o: $(SRCDIR)/%$(EXT)
        $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $<