Multiple Definition в “неправильных” местах. C++,

107
26 августа 2021, 17:50

компилятор пинается на какое-то множественное обьявление, но то, что как он считает множественно обьявляется не существуют в представленном им коде

Логи:

      SDL_Renderer * renderer = get_rnd();
                 ^
C:\c++\programs\life3\main.cpp:18:15: warning: unused variable 'window' [-Wunused-variable]
  SDL_Window * window = get_wnd();
               ^
In file included from C:\c++\programs\life3\Presenter/Observer.h:15:0,
                 from C:\c++\programs\life3\main.cpp:13:
C:/c++/programs/life3/Input/Input.h: In member function 'cords Input::check_input()':
C:/c++/programs/life3/Input/Input.h:39:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
In file included from C:\c++\programs\life3\SDL_stuf\cGraf.h:25:0,
                 from C:\c++\programs\life3\SDL_stuf\customSDL.h:19,
                 from C:\c++\programs\life3\SDL_stuf\customSDL.cpp:1:
C:/c++/programs/life3/pcgGlobal.h:35:18: warning: 'Dark' defined but not used [-Wunused-variable]
 static SDL_Color Dark = {67, 68, 69};    // dark grey
                  ^
C:/c++/programs/life3/pcgGlobal.h:36:18: warning: 'Dark2' defined but not used [-Wunused-variable]
 static SDL_Color Dark2 = {34, 34, 34};    // dark grey
                  ^
C:/c++/programs/life3/pcgGlobal.h:37:18: warning: 'Grey' defined but not used [-Wunused-variable]
 static SDL_Color Grey = {187, 191, 194}; // light grey
                  ^
C:/c++/programs/life3/pcgGlobal.h:38:18: warning: 'Red' defined but not used [-Wunused-variable]
In file included from C:\c++\programs\life3\main.cpp:12:0:
C:\c++\programs\life3\pcgGlobal.h: At global scope:
C:\c++\programs\life3\pcgGlobal.h:35:18: warning: 'Dark' defined but not used [-Wunused-variable]
 static SDL_Color Dark = {67, 68, 69};    // dark grey
                  ^
C:\c++\programs\life3\pcgGlobal.h:36:18: warning: 'Dark2' defined but not used [-Wunused-variable]
 static SDL_Color Dark2 = {34, 34, 34};    // dark grey
                  ^
C:\c++\programs\life3\pcgGlobal.h:37:18: warning: 'Grey' defined but not used [-Wunused-variable]
 static SDL_Color Grey = {187, 191, 194}; // light grey
                  ^
C:\c++\programs\life3\pcgGlobal.h:38:18: warning: 'Red' defined but not used [-Wunused-variable]
 static SDL_Color Red = {255, 0, 0};      // red
                  ^
C:\c++\programs\life3\pcgGlobal.h:40:18: warning: 'Blue' defined but not used [-Wunused-variable]
 static SDL_Color Blue = {0, 0, 255};     // blue
                  ^
C:\c++\programs\life3\pcgGlobal.h:42:18: warning: 'Cool' defined but not used [-Wunused-variable]
 static SDL_Color Cool = { 0,100,100 }; //cool
                  ^
 static SDL_Color Red = {255, 0, 0};      // red
                  ^
C:/c++/programs/life3/pcgGlobal.h:40:18: warning: 'Blue' defined but not used [-Wunused-variable]
 static SDL_Color Blue = {0, 0, 255};     // blue
                  ^
C:/c++/programs/life3/pcgGlobal.h:42:18: warning: 'Cool' defined but not used [-Wunused-variable]
 static SDL_Color Cool = { 0,100,100 }; //cool
                  ^
In file included from C:\c++\programs\life3\SDL_stuf\customSDL.h:20:0,
                 from C:\c++\programs\life3\SDL_stuf\cGraf.h:13,
                 from C:\c++\programs\life3\SDL_stuf\cView.cpp:1:
C:/c++/programs/life3/pcgGlobal.h:35:18: warning: 'Dark' defined but not used [-Wunused-variable]
 static SDL_Color Dark = {67, 68, 69};    // dark grey
                  ^
C:/c++/programs/life3/pcgGlobal.h:36:18: warning: 'Dark2' defined but not used [-Wunused-variable]
 static SDL_Color Dark2 = {34, 34, 34};    // dark grey
                  ^
C:/c++/programs/life3/pcgGlobal.h:37:18: warning: 'Grey' defined but not used [-Wunused-variable]
 static SDL_Color Grey = {187, 191, 194}; // light grey
                  ^
C:/c++/programs/life3/pcgGlobal.h:38:18: warning: 'Red' defined but not used [-Wunused-variable]
 static SDL_Color Red = {255, 0, 0};      // red
                  ^
C:/c++/programs/life3/pcgGlobal.h:40:18: warning: 'Blue' defined but not used [-Wunused-variable]
 static SDL_Color Blue = {0, 0, 255};     // blue
                  ^
C:/c++/programs/life3/pcgGlobal.h:42:18: warning: 'Cool' defined but not used [-Wunused-variable]
 static SDL_Color Cool = { 0,100,100 }; //cool
                  ^
obj\Debug\Model\Creature.o: In function `ZN8Creature9make_moveEi':
C:/c++/programs/life3/Model/Creature.cpp:3: multiple definition of `renderera'
obj\Debug\main.o:C:/c++/programs/life3/Input/Input.h:28: first defined here
obj\Debug\Model\Creature.o: In function `ZN8Creature9make_moveEi':
C:/c++/programs/life3/Model/Creature.cpp:3: multiple definition of `windowa'
obj\Debug\main.o:C:/c++/programs/life3/Input/Input.h:28: first defined here
obj\Debug\Model\Turn_Handler.o: In function `ZN6ObjectC2Ev':
C:/c++/programs/life3/Model/Turn_Handler.cpp:5: multiple definition of `renderera'
obj\Debug\main.o:C:/c++/programs/life3/Input/Input.h:28: first defined here
obj\Debug\Model\Turn_Handler.o: In function `ZN6ObjectC2Ev':
C:/c++/programs/life3/Model/Turn_Handler.cpp:5: multiple definition of `windowa'
obj\Debug\main.o:C:/c++/programs/life3/Input/Input.h:28: first defined here
obj\Debug\Model\World.o: In function `ZNSt12_Destroy_auxILb1EE9__destroyIP4FoodEEvT_S4_':
C:/c++/programs/life3/Model/World.cpp:4: multiple definition of `renderera'
obj\Debug\main.o:C:/c++/programs/life3/Input/Input.h:28: first defined here
obj\Debug\Model\World.o: In function `ZNSt12_Destroy_auxILb1EE9__destroyIP4FoodEEvT_S4_':
C:/c++/programs/life3/Model/World.cpp:4: multiple definition of `windowa'
obj\Debug\main.o:C:/c++/programs/life3/Input/Input.h:28: first defined here
obj\Debug\SDL_stuf\customSDL.o: In function `ZSt4moveIRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEONSt16remove_referenceIT_E4typeEOS8_':
C:/c++/programs/life3/SDL_stuf/customSDL.cpp:5: multiple definition of `renderera'
obj\Debug\main.o:C:/c++/programs/life3/Input/Input.h:28: first defined here
obj\Debug\SDL_stuf\customSDL.o: In function `ZSt4moveIRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEONSt16remove_referenceIT_E4typeEOS8_':
C:/c++/programs/life3/SDL_stuf/customSDL.cpp:5: multiple definition of `windowa'
obj\Debug\main.o:C:/c++/programs/life3/Input/Input.h:28: first defined here
obj\Debug\SDL_stuf\cView.o: In function `ZN4View4LineE5cordsS0_9SDL_Color':
C:/c++/programs/life3/SDL_stuf/cView.cpp:5: multiple definition of `renderera'
obj\Debug\main.o:C:/c++/programs/life3/Input/Input.h:28: first defined here
obj\Debug\SDL_stuf\cView.o: In function `ZN4View4LineE5cordsS0_9SDL_Color':
C:/c++/programs/life3/SDL_stuf/cView.cpp:5: multiple definition of `windowa'
obj\Debug\main.o:C:/c++/programs/life3/Input/Input.h:28: first defined here
collect2.exe: error: ld returned 1 exit status

вот два примера кода, первый, где переменная , якобы, переобъявляется, второй где она, опять же якобы, обьявлена впервые

void Creature::make_move(int dir)
{// ТУТ ПЕРЕОБЬЯВЛЕНА
    switch( dir )
    {
    case RIGHT:
        x = x + spd;
    break;
    case LEFT:
        x = x - spd;
    break;
    case UP:
        y = y - spd;
    break;
    case DOWN:
        y = y + spd;
    break;
   }
}

cords Input::check_input()
{// И ЯКОБЫ НА ЭТОЙ СТРОЧКЕ ОБЬЯВЛЕНА ВПЕРВЫЕ
    if( SDL_PollEvent( &e ) != 0)
    {
        if( e.type == SDL_MOUSEBUTTONDOWN )
        {
            int mx,my;
            SDL_GetMouseState(&mx,&my);
            cords click = { mx,my };
            return click;
        }
    }
}

Хотя данная переменная обьявлена абсолютно в другом месте, как статичный указатель с функциями доставания

SDL_Renderer * renderera=nullptr;
SDL_Window * windowa=nullptr;
inline SDL_Renderer* get_rnd() { return renderera; }
inline SDL_Window* get_wnd() { return windowa; }

первые 20 строк Creature.cpp

#include "Creature.h"
void Creature::make_move(int dir)
{
    switch( dir )
    {
    case RIGHT:
        x = x + spd;
    break;
    case LEFT:
        x = x - spd;
    break;
    case UP:
        y = y - spd;
    break;
    case DOWN:
        y = y + spd;
    break;
    }

27,28,29 строка Input.h

cords Input::check_input()
{
    if( SDL_PollEvent( &e ) != 0)
Answer 1

Из вашего описания можно сделать вывод, что объявления

SDL_Renderer * renderera=nullptr;
SDL_Window * windowa=nullptr;
inline SDL_Renderer* get_rnd() { return renderera; }
inline SDL_Window* get_wnd() { return windowa; }

у вас располагаются в некоем заголовочном файле, который включен в несколько файлов реализации. Это, разумеется, приводит к ошибкам множественного определения renderera и windowa (как и должно быть).

В GCC при компиляции с -g линкер в сообщениях об ошибках множественного определения выдает не только имена объектных файлов, в которых располагаются эти множественные определения, но и строчки исходных файлов, в которых эти определения были сделаны. В некоторых случаях линкер в такой ситуации указывает на бессмысленную строчку (см. напр. комментарий)

Ваша попытка "исправить ошибку" путем объявления renderera и windowa как static является, разумеется, бессмысленной профанацией. Эти переменные скорее всего задуманы как глобальные. Более того, такое "исправление" делает вашу программу некорректной. Это нарушение ODR (no diagnostic is required). Inline-функциям с внешним связыванием не разрешается ссылаться на разные статические переменные в контексте разных единиц трансляции.

Простейший способ исправить ошибку в С++17 - объявить их как inline.

Answer 2

Чтож, потыкаясь в код, решил обьявить SDL_Renderer * renderera и SDL_Window * windowa как статичные, это полностью решило проблему. Спасибо, кто пытался помочь.

READ ALSO
Ошибки LNK2005 и LNK1169

Ошибки LNK2005 и LNK1169

Пытаюсь поэкспериментировать с файлами в проектеВыводит ошибки LNK2005 и LNK1169

72
Символьный массив

Символьный массив

Задание: Вывести слова введенного текста, изменив каждое слово следующим образом: буквы слова, стоящие до первой гласной, перенести в конец...

78
Как найти утечку памяти?

Как найти утечку памяти?

Проблема в xPtr, никак не могу найти ошибку, он на нулевом элементе даже

97