VS Code不会构建包含多个.ccp源文件的c ++程序

时间:2017-12-06 02:29:51

标签: c++ linux ubuntu gcc visual-studio-code

请注意,我在Ubuntu 17.10上使用VS Code并使用GCC编译器。

我在构建一个使用其他.ccp文件的简单程序时遇到了麻烦。我可能会遗漏一些明显的东西,因为我对编程很新,但我会解释到目前为止我所做的事情。这使我无法继续学习我正在做的教程。

我写了一个非常简单的程序来证明我的观点如下。

main.ccp

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

using namespace std;

int main ()
{

speak();

return 0;
}

Cat.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社区的教程的原因是我想知道大多数事情的内幕是什么。另外,我想让VS Code为我工作,因为它到目前为止一直很棒。

12 个答案:

答案 0 :(得分:6)

感到懒惰,

这是用于Linux发行版的vscode的task.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
        }
    }
]

}

答案 1 :(得分:2)

这是Windows针对同一问题的答案:

https://code.visualstudio.com/docs/cpp/config-mingw处找到以下答案之前,我也在为此苦苦挣扎:

您可以使用"${workspaceFolder}\\*.cpp"之类的参数代替${file}来修改task.json以构建多个C ++文件。这将在当前文件夹中构建所有.cpp文件。您也可以通过将“ ${fileDirname}\\${fileBasenameNoExtension}.exe”替换为硬编码的文件名来修改输出文件名(例如“ ${workspaceFolder}\\myProgram.exe")”。

请注意,workspaceFolder中的F大写。

例如,在我项目的task.json文件中,“ args”下方括号之间的文本最初显示如下:

"-g",
  "${file}",
  "-o",
  "${fileDirname}\\${fileBasenameNoExtension}.exe"

这给了我参考错误,因为它只编译一个文件,而不是两个文件。

但是,将文本更改为以下内容后,我能够使程序正常工作:

"-g",
"${workspaceFolder}\\*.cpp",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"

答案 2 :(得分:1)

如果你有多个文件而且一个文件依赖于另一个cpp文件,你需要告诉g ++编译它,所以链接器可以找到它。最简单的方法是:

$ g++ Cat.cpp main.cpp -o Classes

作为旁注,您应该使用警告编译,最低限度为-Wall,可能为-Wextra,可能还有-Wpedantic,因此您知道您正在做的事情是有问题的。

答案 3 :(得分:1)

在VS Code程序的“终端”选项卡上写下此内容
(请注意,您可能需要从设置中激活才能通过终端而不是输出来运行)

$ g ++ nameOne.cpp nameTwo.cpp -o a.out
$ ./a.out

答案 4 :(得分: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"

如果源位于单独的文件夹中,它将起作用

答案 5 :(得分:0)

如果文件扩展名为ccp或cpp?

,会有所不同吗?

答案 6 :(得分:0)

"tasks": [
    {
        "label": "echo",
        "type": "shell",
        "command": "g++",
        "args":[
            "-g","main.cpp","cat.cpp"
        ],
        "group": {
            "kind": "build",
            "isDefault": true
        }
    }

只需在args中添加cat.cpp,然后尝试运行即可。它应该在VS代码上运行时没有错误

答案 7 :(得分:0)

对于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文件。

答案 8 :(得分:0)

如果您使用的是 linux,那么知道如何使用 make。如果节省很多时间和精力。如果您甚至有 10 或 100 个文件并且存在一些依赖项,那么只需创建一次 Makefile,每次编译时只需使用一个命令 make 即可完成所有工作。甚至您可以在 VSCode 中为该命令创建键盘快捷键。

查看 here 以在 VSCode 中使用 makehere

答案 9 :(得分:0)

在 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"
    }
]

}

答案 10 :(得分:0)

我遇到了类似的问题,要找到我完全理解的答案并不容易。您需要了解的第一件事是项目中使用的所有 .cpp 文件都需要为链接器编译。对于只有一个 .cpp 文件的项目,相对没有问题。您只需要通过在终端中从根目录运行以下命令来告诉 g++ 需要编译哪个 .cpp 文件:

g++ -g main.cpp -o mainApp 

这告诉 g++ 编译 main.cpp 并创建一个名为 mainApp 的 consolApp(输出文件)。

  1. 如果项目包含多个 .cpp 文件,

|--root

  • |--main.cpp}
  • |--include1
    • |-- 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 文件的顺序并不重要。

  1. 您已经明白,对于一个非常大的项目,编写该命令将非常乏味。你可以重写如下

    g++ -g ./*.cpp include1/*.cpp include2/*.cpp -o mainApp

这只是告诉 g++ 编译根目录、include1 和 include2 文件夹中的所有 .cpp 文件。

  1. 如果你的项目有很多文件夹,你可以简单地递归运行它

    g++ -g ./**/*.cpp -o mainApp

这有点像告诉 g++ 遍历根文件夹和其他文件夹并编译它会找到的所有 .cpp 文件。

  1. 要在 vscode 中执行相同的操作,请转到 tasks.json 文件,然后在“args”中添加:

    "${workspaceFolder}/.cpp",
    "${workspaceFolder}/**/
    .cpp",

这相当于:

g++ -g ./**/*.cpp -o mainApp

答案 11 :(得分:0)

在找到很多解决方案后,我发现这只能奏效, 安装代码运行器扩展。在设置中, 转到右上角的打开设置 只需将此行粘贴到 setting.json 中最后一个右括号 }

的末尾之前

"code-runner.executorMap": {
    "cpp": "cd $dir && g++ *.cpp -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
},

[settings.json --> 文件看起来像] :https://i.stack.imgur.com/pUBYU.png