我们是经验丰富的 C++ 开发人员。我们已经使用 Visual Studio 多年,但我们绝对无法让 Visual Studio Code 查看我们的外部头文件文件夹。
我们可以编译并运行一个简单的单文件 C++ 程序,但是一旦我们尝试包含外部标头,它就会给我们带来可怕的“没有这样的文件或目录”错误。
我们安装了 Microsoft C/C++ 扩展。我们已经安装了 g++ 编译器并位于我们的路径中。而且,就像我说的,它可以很好地编译单个文件 C++ 程序。我们没有做任何花哨的事情:
我们手动在c_cpp_properties.json文件中添加了外部头的路径:
"includePath": [
"${workspaceFolder}/**",
"C:/special_api/**"
],
我们收到错误。然后我们使用 C/C++ 配置 GUI:
我们收到错误。
我们交换了斜杠,因为 Windows 有时会出现问题:
"includePath": [
"${workspaceFolder}/**",
"C:\\special_api\\**"
],
但是无论我们做什么,我们都会收到此错误:
C:\Work Area\cpp-experiment\HelloWorld.cpp:2:10: fatal error: experiment.h: No such file or directory
#include "experiment.h"
^~~~~~~~~~~~~~
compilation terminated.
Build finished with error(s).
The terminal process terminated with exit code: -1.
我什至没有看到它在编译命令中指定包含文件夹的位置:
C:\Tools\x86_64-8.1.0-win32-seh-rt_v6-rev0\mingw64\bin\g++.exe -g "C:\Work Area\cpp-experiment\HelloWorld.cpp" -o "C:\Work Area\cpp-experiment\HelloWorld.exe"
虽然我不得不承认,我不是一个 C++ 命令行编译专家;我通常只使用 IDE,让它处理复杂的命令。
我们知道头文件是有效的,因为当我们将其移动到与 .cpp 文件相同的文件夹时,它工作得很好。当它位于外部文件夹中时,VSC 就找不到它。
当然,我们已经阅读了文档,但它们对这个特定问题的帮助不大。有谁知道如何让 Visual Studio Code 识别外部头文件路径?
您需要编写一个任务来进行构建。 该任务通常会运行一个 makefile,您可以在其中指定构建选项,包括编译器搜索路径。 VSCODE 不会为你做这个。
任务示例
{
"label": "make PDG",
"options": {
"cwd": "${workspaceFolder}/../../PelexDataGraph"
},
"command": "mingw32-make.exe",
"args": [
"pdg"
],
"group": "build",
"problemMatcher": [
"$gcc"
]
},
makefile 示例
#source file search paths
VPATH = ../../src ../../src/ext ../../PeakParams2 \
../../PelexDataGraph
# compiler include search paths
INCS=-I../../src -I../../src/ext \
-I../../pelexMixer \
-I../../../windex/include -I../../../boost/boost1_72
# libraries required by linker
LIBS=-lstdc++fs -lgdiplus -lgdi32 -lcomdlg32 -lws2_32 -lwsock32
# folder for .o files
ODIR=./obj
# PPE sources
_OBJppe = PeakParameterEditor.o \
cPPEForm.o cValues.o cChannelFilterEditor.o \
cDetectorConfig.o cGroup.o cMixerUIClient.o \
Widgets.o \
Configure.o cPeakFilterSet.o ChannelLabels.o \
raven_sqlite.o sqlite3.o
OBJppe = $(patsubst %,$(ODIR)/%,$(_OBJppe))
# PDG sources
_OBJpdg = PelexDataGraph.o
OBJpdg = $(patsubst %,$(ODIR)/%,$(_OBJpdg))
$(ODIR)/sqlite3.o: sqlite3.c
gcc -c -o $@ $<
$(ODIR)/%.o: %.cpp
g++ -std=c++17 -c -o $@ $< $(INCS)
ppe: $(OBJppe)
g++ -o ../../bin/PeakParameterEditor.exe $^ $(INCS) $(LIBS)
pdg: $(OBJpdg)
g++ -o ../../bin/PelexDataGraph.exe $^ $(LIBS)