VS Code 不会使用多个 .ccp 源文件构建 c++ 程序
Posted
技术标签:
【中文标题】VS Code 不会使用多个 .ccp 源文件构建 c++ 程序【英文标题】:VS Code will not build c++ programs with multiple .ccp source files 【发布时间】:2018-05-19 20:07:06 【问题描述】:请注意,我在 Ubuntu 17.10 上使用 VS Code 并使用 GCC 编译器。
我在构建一个使用其他 .ccp 文件的简单程序时遇到了问题。我可能在这里遗漏了一些明显的东西,因为我对编程还很陌生,但我会解释一下我到目前为止所做的事情。这让我无法继续我正在做的教程。
我编写了一个非常简单的程序来证明我的观点,如下所示。
main.ccp
#include <iostream>
#include "Cat.h"
using namespace std;
int main ()
speak();
return 0;
猫.h
#pragma once
void speak();
Cat.ccp
#include <iostream>
#include "Cat.h"
using namespace std;
void speak()
std::cout << "Meow!!" << std::endl;
这个简单的程序在 Codeblocks 和 Visual Studio Community 2017 中都没有问题,我不知道我需要做什么才能让它运行。 底部的这个错误表明 Cat.ccp 文件根本没有被拾取。如果我要将这个 Cat.ccp 中的定义放到头文件中,程序编译并运行良好,但我需要使用那个 .ccp 文件,因为我知道这是分离代码的公认方式。我会注意到所有文件也都在同一个文件夹中。
我知道我可能需要告诉 VS Code 在哪里查找 Cat.ccp 文件,但奇怪的是它会在同一位置找到标头。尽管如此,在网上查看后,我一直在阅读我可能需要将一个目录放入 c_cpp_intellisense_properties.json 中。这是我的样子。
"configurations": [
"name": "Mac",
"includePath": [
"/usr/include",
"/usr/local/include",
"$workspaceRoot"
],
"defines": [],
"intelliSenseMode": "clang-x64",
"browse":
"path": [
"/usr/include",
"/usr/local/include",
"$workspaceRoot"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
,
"macFrameworkPath": [
"/System/Library/Frameworks",
"/Library/Frameworks"
]
,
"name": "Linux",
"includePath": [
"/usr/include/c++/7",
"/usr/include/x86_64-linux-gnu/c++/7",
"/usr/include/c++/7/backward",
"/usr/lib/gcc/x86_64-linux-gnu/7/include",
"/usr/local/include",
"/usr/lib/gcc/x86_64-linux-gnu/7/include-fixed",
"/usr/include/x86_64-linux-gnu",
"/usr/include",
"/home/danny/Documents/C++_Projects/24_-_Classes/Cat.cpp",
"$workspaceRoot",
"/home/danny/Documents/C++_Projects/24_-_Classes/",
"/home/danny/Documents/C++_Projects/24_-_Classes/.vscode",
"/home/danny/Documents/C++_Projects/24_-_Classes/.vscode/Cat.cpp"
],
"defines": [],
"intelliSenseMode": "clang-x64",
"browse":
"path": [
"/usr/include/c++/7",
"/usr/include/x86_64-linux-gnu/c++/7",
"/usr/include/c++/7/backward",
"/usr/lib/gcc/x86_64-linux-gnu/7/include",
"/usr/local/include",
"/usr/lib/gcc/x86_64-linux-gnu/7/include-fixed",
"/usr/include/x86_64-linux-gnu",
"/usr/include",
"$workspaceRoot",
"/home/danny/Documents/C++_Projects/24_-_Classes/",
"/home/danny/Documents/C++_Projects/24_-_Classes/.vscode/Cat.cpp"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
,
"name": "Win32",
"includePath": [
"C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/include",
"$workspaceRoot"
],
"defines": [
"_DEBUG",
"UNICODE"
],
"intelliSenseMode": "msvc-x64",
"browse":
"path": [
"C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/include/*",
"$workspaceRoot"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
],
"version": 3
有一次我想知道是否需要在其中添加一个双重命令来告诉编译器在 tasks.json 中构建两个 .ccp 文件,但我还没有弄清楚如何这样做,或者即使这是正确的方法。
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": "g++ -g /home/danny/Documents/C++_Projects/24_-_Classes/main.cpp -o Classes",
"group":
"kind": "build",
"isDefault": true
,
"problemMatcher":"$gcc"
]
感谢任何帮助。万一你想知道,我不只是在 Codeblocks 或 VS Community 中完成教程的原因是我想知道大多数事情的幕后发生了什么。另外,我想让 VS Code 为我工作,因为到目前为止它很棒。
【问题讨论】:
我对 VS Code 一无所知,但你肯定需要告诉它编译并将两个 CPP 文件链接到可执行文件中。找到头文件是因为您在 main.cpp 中引用了它。 【参考方案1】:在tasks.json中:
"label": "g++.exe build active file",
"args": [
"-g",
"$fileDirname\\**.cpp",
//"$fileDirname\\**.h",
"-o",
"$fileDirname\\$fileBasenameNoExtension.exe",
],
在launch.json中:
"preLaunchTask": "g++.exe build active file"
如果您的来源位于单独的文件夹中,它将起作用
【讨论】:
别人可能很难理解你的回答。您应该提供一些解释,特别是它如何回答问题。 对不起..我学英语而且不流利,但我会尽力而为 它构建所有以 .cpp 名称结尾的文件。 -o(输出文件)指定可执行文件应具有的名称以及应位于的位置。对于 Linux 上的我来说,该目录称为“workspaceFolder”,即“$workspaceFolder/**.cpp” @Anns98 使用"$fileDirname\\**.cpp",
gcc 时将 **.cpp 作为文字,我收到错误 "(...)**.c: No such file or directory"
@Tiago 对于那些有同样问题的人,您必须使用正斜杠来选择所有 .cpp 文件,例如 "$fileDirname/**.cpp"
而不是 "$fileDirname\\**.cpp"
【参考方案2】:
感觉很懒,
这是用于linux发行版的vscode的tasks.json,用于编译多个cpp文件。
"version": "2.0.0",
"tasks": [
"type": "shell",
"label": "C/C++: g++ build active file",
"command": "/usr/bin/g++",
"args": [
"-g",
"$fileDirname/*.cpp",
"-o",
"$fileDirname/$fileBasenameNoExtension"
],
"options":
"cwd": "/usr/bin"
,
"problemMatcher": [
"$gcc"
],
"group":
"kind": "build",
"isDefault": true
]
【讨论】:
【参考方案3】:这是同一问题的 Windows 答案:
我也在为此苦苦挣扎,直到在https://code.visualstudio.com/docs/cpp/config-mingw 找到以下答案:
您可以修改您的 tasks.json 以使用
"$workspaceFolder\\*.cpp"
之类的参数而不是$file
来构建多个 C++ 文件。这将在 >您的当前文件夹中构建所有 .cpp 文件。您还可以通过将"$fileDirname\\$fileBasenameNoExtension.exe"
替换为硬编码的文件名(例如,"$workspaceFolder\\myProgram.exe"
)来修改输出文件名。
注意workspaceFolder中的F是大写的。
例如,在我的项目中的tasks.json文件中,“args”下括号之间的文本最初出现如下:
"-g",
"$file",
"-o",
"$fileDirname\\$fileBasenameNoExtension.exe"
这给了我参考错误,因为它只编译了一个文件而不是两个文件。
但是,在将文本更改为以下内容后,我能够让程序运行:
"-g",
"$workspaceFolder\\*.cpp",
"-o",
"$fileDirname\\$fileBasenameNoExtension.exe"
【讨论】:
是 `\` windows 语法吗? @mLstudent33 是的,这是 Windows 转义语法。 这适用于嵌套文件夹吗?我一直在想办法让它适用于嵌套文件夹,比如$workspaceFolder\\**\\*.cpp
【参考方案4】:
如果你有多个文件,其中一个依赖cpp
文件作为另一个文件,你需要告诉 g++ 也编译它,这样链接器才能找到它。最简单的方法是:
$ g++ Cat.cpp main.cpp -o Classes
附带说明一下,您可能应该在编译时带有警告,最少 -Wall
,可能是 -Wextra
,可能还有 -Wpedantic
,这样您就知道您正在做的事情是否有问题。
【讨论】:
你建议一个一个地添加每个文件?认真的吗? 好吧,你可以说它很简单。但这与最初的问题无关:问题是如何告诉 VSCODE 关于依赖关系而不是g++
【参考方案5】:
"tasks": [
"label": "echo",
"type": "shell",
"command": "g++",
"args":[
"-g","main.cpp","cat.cpp"
],
"group":
"kind": "build",
"isDefault": true
只需在 args 中添加 cat.cpp 然后尝试运行。它应该在 VS 代码上运行而不会出错
【讨论】:
我想这是一种方法。添加任务后确保他理解,他需要在列表中的文件上右击选择"echo"
进行编译。【参考方案6】:
在 VS Code 程序的终端选项卡上写下以下内容:
$ g++ nameOne.cpp nameTwo.cpp -o a.out
$ ./a.out
【讨论】:
【参考方案7】:在 Windows 上,解决方案是
"version": "2.0.0",
"tasks": [
"type": "cppbuild",
"label": "C/C++: cl.exe compila il file attivo",
"command": "cl.exe",
"args": [
"/Zi",
"/EHsc",
"/nologo",
"/Fe:",
"$fileDirname\\$fileBasenameNoExtension.exe",
"*.c"
],
"options":
"cwd": "$workspaceFolder"
,
"problemMatcher": [
"$msCompile"
],
"group":
"kind": "build",
"isDefault": true
,
"detail": "compilatore: cl.exe"
]
【讨论】:
【参考方案8】:在找到了很多解决方案后,我发现这只有效, 安装代码运行器扩展。在设置中, 转到右上角的打开设置 并简单地将这一行粘贴到 setting.json 最后一个右括号
的末尾"code-runner.executorMap":
"cpp": "cd $dir && g++ *.cpp -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
,
[settings.json --> 文件看起来像] :https://i.stack.imgur.com/pUBYU.png
【讨论】:
【参考方案9】:对于 Mac,您可以使用
"version": "2.0.0",
"tasks": [
"type": "shell",
"label": "shell: g++ build active file",
"command": "/usr/bin/g++",
"args": [
"-g",
"-Wall",
"-Wextra",
"-Wpedantic",
"$workspaceFolder/*/*.cpp",
"$fileDirname/*.cpp",
"-o",
"$fileDirname/$fileBasenameNoExtension"
],
"options":
"cwd": "/usr/bin"
,
"problemMatcher": [
"$gcc"
],
"group":
"kind": "build",
"isDefault": true
]
这将编译所有包含 .cpp 文件的目录的所有 cpp 文件。
【讨论】:
感谢您的回答,能否请您告诉我如何包含头文件?【参考方案10】:如果您使用的是 linux,那么知道如何使用make
。如果节省很多时间和精力。如果您甚至有 10 或 100 多个文件并且存在一些依赖项,那么只需创建一个 Makefile
一次,并且每次编译时只需使用一个命令 make
,这将为您完成所有工作。甚至您可以在 VSCode 中为该命令创建键盘快捷键。
查看 here 以在 VSCode 中使用 make
和 here。
【讨论】:
【参考方案11】:学分:Anns98。
记住下面args
是属于g++.10.2.0 C++17的。
您应该隐式/显式地调整您的编译器以实现您想要的一致性。
结帐: winlibs (gcc-10.2.0-llvm-11.0.0-mingw-w64-8.0.0-r5) 看起来很有希望。
"version": "2.0.0",
"tasks": [
"type": "cppbuild",
"label": "retr0C++",
"command": "C:\\mingw64\\bin\\g++",
"args": [
"-std=c++17",
"-I",
"$fileDirname\\includes",
"-o",
"$fileDirname\\$fileBasenameNoExtension.exe",
"-g",
//"$file",
"$fileDirname\\**.cpp"
],
"options":
"cwd": "C:\\mingw64\\bin"
,
"problemMatcher": ["$gcc"],
"group":
"kind": "build",
"isDefault": true
,
"detail": "compiler: C:\\mingw64\\bin\\g++"
]
【讨论】:
【参考方案12】:我也遇到过类似的问题,要找到我完全理解的答案并不容易。您需要了解的第一件事是项目中使用的所有 .cpp 文件都需要针对链接器进行编译。对于具有一个 .cpp 文件的项目,相对没有问题。您只需要通过在终端中从根目录运行以下命令来告诉 g++ 需要编译哪个 .cpp 文件:
g++ -g main.cpp -o mainApp
这告诉 g++ 编译 main.cpp 并创建一个名为 mainApp 的 consolApp(输出文件)。
-
如果项目有多个 .cpp 文件,
|--root
|--main.cpp |--包括1 |-- foo1.h |-- foo1.cpp |-- 包括2 |-- foo2.h |-- foo2.cpp |-- foo3.cpp要编译这个项目并构建我们在终端中运行的输出文件:
g++ -g main.cpp include1/foo1.cpp include2/foo2.cpp foo3.cpp -o mainApp
请注意,我们传递要编译的 .cpp 文件的顺序并不重要。
您已经可以理解,对于一个非常大的项目,编写该命令将非常乏味。你可以重写如下
g++ -g ./*.cpp include1/*.cpp include2/*.cpp -o mainApp
这只是告诉 g++ 编译根目录、include1 和 include2 文件夹中的所有 .cpp 文件。
如果你的项目有很多文件夹,你可以简单地递归运行它
g++ -g ./**/*.cpp -o mainApp
这有点像告诉 g++ 遍历根文件夹和其他文件夹并编译它会找到的所有 .cpp 文件。
要在 vscode 中执行相同的操作,请转到 tasks.json 文件,然后在 'args' 中添加:
"$workspaceFolder/.cpp", "$workspaceFolder/**/.cpp",
这相当于:
g++ -g ./**/*.cpp -o mainApp
【讨论】:
以上是关于VS Code 不会使用多个 .ccp 源文件构建 c++ 程序的主要内容,如果未能解决你的问题,请参考以下文章
每次构建/运行时,VS Code 都会打开一个新的调试控制台