Multiple Definition на C++ не даёт покоя

Делаю небольшой проект в Qt Creator. Есть три файла и 2 из них конфликтуют между собой и линковщику становится плохо - выдает мне Multiple Definition.

Вот код:

Game.h:

#pragma once

#include <iostream>
#include <X11/Xlib.h> // Нужное подключение

// Тут небольшой пропуск...

using namespace std;

// Инициализация функций
void menu(); // Для меню
void start(); // Для инициализации
void customize(); // Для отдельной кастомизации

// Переменные из Xlib для определения ширины и высоты монитора
Display *d;
Screen *s;

// Если что все структуры описаны, и описаны правильно
struct main_character character;
vector<struct location*> locations;
struct save _save;

// И остальное...

Game.cpp:

#include "Game.h"

void start()
{
    d = XOpenDisplay(NULL);
    s = DefaultScreenOfDisplay(d);

  // С остальным проблем нет
}

void menu()
{
    // Тут проблем нет..
}

void customize()
{
   character.life = bool;
   character.health = 100;
   // И остальное настраивание
}

main.cpp

#include "Game.h" // Просто подключаю
   
int main()
{
       start(); // Просто начинаю программу
}

Вообщем за такое мне линковщик сказал, что с переменными d, s, character, location, _save (притом, что 2 последних я даже не использовал) произошел Multiple Definition, first define here. Я подумал-подумал и добавил к ним extern

Линковщик таких финтов не понял, и поэтому выдал мне что в функции start() у меня undefined reference to 'd' и to 's', а в customize у меня undefined reference to 'character' (скорее всего если я буду использовать location и _save, то мне тоже влетит, а так пока что норм). Вообщем я хз почему так, но скорее всего, я криво подключил файлы, хотя всё вроде логично: Game.cpp(описание функций) -> Game.h <- main.cpp

p.s.: если в main.cpp подключить Game.cpp, то всё равно не запустится(


Ответы (1 шт):

Автор решения: Harry

Вот такие вещи -

Display *d;
Screen *s;

надо в заголовочных файлах делать либо inline (в последних версиях С++), либо

extern Display *d;
extern Screen *s;

а затем определять их в .cpp-файле.

Так, как у вас - в каждом .cpp-файле имеются переменные с одинаковыми именами - то самое множественное определение...

Да, на всякий случай - если вам предложат написать вместо extern - static, ошибки компиляции не будет, но переменная в одном .cpp-файле не будет иметь никакого отношения к той же переменной в другом - это будут разные переменные, несмотря на одинаковое имя.

→ Ссылка