多重定义 ...c++ vsCode [重复]

Multiple Definition of ... c++ vsCode [duplicate]

提问人:Darky 提问时间:7/24/2022 更新时间:7/24/2022 访问量:911

问:

我搜索了很多,但找不到问题。 我构建了一个简单的贪吃蛇游戏。我正在使用 Makefile 进行构建和调试。但是我切换到了 VS-Code。现在我只遇到了 Makefile 没有的问题。

我需要在 Vs-Code 中更改某些内容吗?

这些是问题:

Starting build...
/usr/bin/g++ -fdiagnostics-color=always -g -o /home/kali/path/snakeMain /home/kali/path/*.cpp -lncurses
/usr/bin/ld: /tmp/ccCKG1t0.o:/home/kali/path/Snake.h:9: multiple definition of `gameOver'; /tmp/ccJxCKEW.o:/home/kali/path/Snake.h:9: first defined here
/usr/bin/ld: /tmp/ccCKG1t0.o:/home/kali/path/Snake.h:14: multiple definition of `headX'; /tmp/ccJxCKEW.o:/home/kali/path/Snake.h:14: first defined here
/usr/bin/ld: /tmp/ccCKG1t0.o:/home/kali/path/Snake.h:14: multiple definition of `headY'; /tmp/ccJxCKEW.o:/home/kali/path/Snake.h:14: first defined here
/usr/bin/ld: /tmp/ccCKG1t0.o:/home/kali/path/Snake.h:17: multiple definition of `tailX'; /tmp/ccJxCKEW.o:/home/kali/path/Snake.h:17: first defined here
/usr/bin/ld: /tmp/ccCKG1t0.o:/home/kali/path/Snake.h:17: multiple definition of `tailY'; /tmp/ccJxCKEW.o:/home/kali/path/Snake.h:17: first defined here
/usr/bin/ld: /tmp/ccCKG1t0.o:/home/kali/path/Snake.h:18: multiple definition of `tailLength'; /tmp/ccJxCKEW.o:/home/kali/path/Snake.h:18: first defined here
/usr/bin/ld: /tmp/ccCKG1t0.o:/home/kali/path/Snake.h:21: multiple definition of `current_dir'; /tmp/ccJxCKEW.o:/home/kali/path/Snake.h:21: first defined here
/usr/bin/ld: /tmp/ccCKG1t0.o:/home/kali/path/Snake.h:23: multiple definition of `key'; /tmp/ccJxCKEW.o:/home/kali/path/Snake.h:23: first defined here
collect2: error: ld returned 1 exit status

Build finished with error(s).

 *  The terminal process terminated with exit code: -1. 
 *  Terminal will be reused by tasks, press any key to close it. 

我在 Linux 中使用最新的 Vs-Code。我今天又安装了它。我认为问题出在错误的链接上。

我不知道如何在 vs-code 中做到这一点,不幸的是,互联网无法帮助我。

这是我的蛇.cpp:

#include <iostream>
#include <ncurses.h>
#include <unistd.h>
#include "Snake.h"

// Setup
void initTerminal() {
}

void initSnake() {
}

// Draw
void drawPixel(int y, int x) {

}

void drawBorder() {
  // PRINT MAP
}

void drawSnake() {
}

// Logic
bool collidesWithBorder() {

}

bool collidesWithSelf() {  
}

void moveSnake() {
}

bool handleKey(int key) {
}

我的蛇Main.cpp:

#include <iostream>
#include <ncurses.h>
#include <unistd.h>
#include "Snake.h"

int main() {
//-----here is only code and no #includes------/
return 0;
}

我的蛇.h

// Copyright 2022
// Author: Darky

#ifndef SNAKE_H_
#define SNAKE_H_

//Golabal var
  // Used for the Loop
  bool gameOver;
  //field Dimensions
  const int f_width = 40;
  const int f_height = 40;
  // Coordinates for the Head of Snake
  int headX, headY;
  // Coordinates for the Tail, max Length (if we continue develop)
  // inital tailLenght (actual length is in drawSnake())
  int tailX[25], tailY[25];
  int tailLength = 0;
  // Direction param
  enum direction { STOP = 0, LEFT, RIGHT, UP, DOWN};
  direction current_dir;
  // input of the User
  int key;

// Functions
//  Initialize the Game
  void initTerminal();
  void initSnake();

// Draw the Game
  // Draw a Singel Pixel into Gamefield
  void drawPixel(int y, int x);
  // Draws the Gamefield
  void drawBorder();
  // Draw Snake with tail
  void drawSnake();

// Logic of the Game
  // Check if hit the border
  bool collidesWithBorder();
  // Check if collides with Snaketail
  bool collidesWithSelf();
  // set the direction of the snake
  void moveSnake();
  // pick input and transfer to direction
  bool handleKey(int key);

#endif // SNAKE_H_

我的tasks.json:

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++ build active file",
            "command": "/usr/bin/g++",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}",
                "${workspaceFolder}/*.cpp",
                "-lncurses"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "Task generated by Debugger."
        }
    ],
    "version": "2.0.0"
}

和我的settings.json:

{
    "files.associations": {
        "iostream": "cpp"
    }
}

同样,如果我在控制台中启动它并使用 makefile 编译它,游戏就会运行。但是在 Vs-Code 中,我遇到了如上所述的问题。

谢谢大家抽出时间接受采访。

C++ 可视化 Studio 代码 GCC 生成文件 链接器错误

评论

0赞 fabian 7/24/2022
gameOver是一个非静态变量,即在包含不同版本变量的每个翻译单元中,都会创建链接器,并且链接器不允许您合并这些编译的结果。如果你真的坚持使用全局变量,你需要在单个翻译单元中定义它们,并在标题中声明它们。不过,我建议不要使用全局变量......Snake.hextern
0赞 user12002570 7/24/2022
一些复制品:dupe1、dupe2、dupe3 和 dupe4请参阅“如何询问”,第一步是搜索,然后是研究

答:

1赞 Sam Varshavchik 7/24/2022 #1

在头文件中:

bool gameOver;

此头文件将 d 放入您的两个文件中。#include.cpp

An 在逻辑上等同于将标头 flie 的内容物理插入到文件中。#include.cpp

以这种方式,您的两个文件都定义了 ,以及此头文件中定义的所有其他变量。.cppgameOver

这违反了 C++ 的一个定义规则:每个对象只能定义一次。这是编译失败的原因。

您需要将所有变量的定义移动到其中一个文件中,并使用头文件中的关键字在头文件中声明所有这些对象,这些对象将包含在两个文件中。.cppextern.cpp

请参阅您的 C++ 教科书,以获取更多信息和对所谓的“正向声明”的解释,以及关键字。extern

评论

0赞 Darky 7/24/2022
哇,你们真的很棒。我以为我的.json是问题所在。您能否告诉我如何在 Vs 代码中链接多个标头和 cpp 文件?非常感谢你们。现在一切正常。
0赞 Sam Varshavchik 7/24/2022
转到 google.com 并键入“链接多个文件vscode”会产生许多非常有用的链接。