请注意,我在Ubuntu 17.10上使用VS Code并使用GCC编译器。
我在构建一个使用其他.ccp文件的简单程序时遇到了麻烦。我可能会遗漏一些明显的东西,因为我对编程很新,但我会解释到目前为止我所做的事情。这使我无法继续学习我正在做的教程。
我写了一个非常简单的程序来证明我的观点如下。
#include <iostream>
#include "Cat.h"
using namespace std;
int main ()
{
speak();
return 0;
}
#pragma once
void speak();
#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文件但我还没有设法成功如何做到这一点,或者即使这是正确的做法。
{
// 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为我工作,因为它到目前为止一直很棒。
答案 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 中为该命令创建键盘快捷键。
答案 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(输出文件)。
|--root
为了编译这个项目并构建输出文件,我们在终端中运行它:
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
答案 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