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中多个文件中的断点?

VS Code 不会保存更改 - Mac

每次构建/运行时,VS Code 都会打开一个新的调试控制台

vs code写C代码,结构成员不会自动提示,要怎么设置吗?

Visual Studio中的c ++并行构建行为[重复]

如何在 VS Code 中同时打开多个 markdown 预览?