Неопределенная ссылка на статическую переменную в С++

Я пытаюсь использовать статическую переменную в одном из моих классов. Я использовал их раньше, без проблем. Теперь я получаю эту ошибку:

/tmp/ccg26aZi.o: В функции 'main': main.cpp:(.text+0x7482): неопределенная ссылка на `Rect::rect_change' collect2: error: ld вернул 1 статус выхода make: *** [exe] Ошибка 1

любой совет? Спасибо!

ОБНОВИТЬ:

Мне сказали проверить мой make-файл, чтобы убедиться, что rect.cpp был включен в создание exe. Я поменял папку, чтобы она была в правильном месте. Но теперь я получаю совершенно новый набор ошибок, которых раньше не было:

Я проверил свой make-файл и убедился, что rect.cpp, и переместил его в другую папку, в которой работал *.cpp. Однако теперь я получаю совершенно новый набор ошибок:

include/Rect.h:16:17: ошибка: «SDL_Rect» не указывает тип Rect (const SDL_Rect & r)

include/Rect.h:16:28: ошибка: ISO C++ запрещает объявление ‘r’ без типа [-fpermissive] Rect( const SDL_Rect & r)

include/Rect.h:19:2: ошибка: 'SDL_Rect' не указывает тип
SDL_Rect getSDL_Rect() ^ include/Rect.h: В конструкторе 'Rect::Rect(const int&)': include/Rect .h:17:9: ошибка: запрос члена 'x' в 'r', который имеет неклассовый тип 'const int': x(rx), y(ry), w(rw), h(rh )

include/Rect.h:17:17: ошибка: запрос члена 'y' в 'r', который имеет неклассовый тип 'const int': x(rx), y(ry), w(rw), ч (правая)

include/Rect.h:17:25: ошибка: запрос члена 'w' в 'r', который имеет неклассовый тип 'const int': x(rx), y(ry), w(rw), ч (правая)

include/Rect.h:17:33: ошибка: запрос члена 'h' в 'r', который имеет неклассовый тип 'const int': x(rx), y(ry), w(rw), ч (правая)

Вот содержимое моего файла make. rect.cpp находится внутри папки src.

exe:    main.cpp
    g++ *.cpp src/*.cpp src/*.c `sdl-config --cflags --libs` -lSDL_image -lSDL_mixer -lSDL_ttf -Iincludes 

run:
    ./a.out

r:
    ./a.out

clean:
    rm a.out

c:
    rm a.out

// header
#ifndef RECT_H
#define RECT_H

#include <iostream>

class Rect
{
public:
    Rect(int x0 = 0, int y0 = 0, int w0 = 0, int h0 = 0)
        : x(x0), y(y0), w(w0), h(h0)
    {}
    Rect( const SDL_Rect & r)
        : x(r.x), y(r.y), w(r.w), h(r.h)
    {}
    SDL_Rect getSDL_Rect()
    {
        SDL_Rect r = {x, y, w, h};
        return r;
    }
    int x, y, w, h;
    static int rect_change;
    static int rect_change_max;
};

inline std::ostream & operator<<(std::ostream & cout, const Rect & r)
{
    cout << "(" << r.x << "," << r.y << "," << r.w << "," << r.h << ")";
    return cout;
}

#endif

rect.cpp    
#include "Rect.h"

int Rect::rect_change = 0;
int Rect::rect_change_max = 0;

   // main.cpp example
   #include "Rect.h"

   int main()
   {
       Rect rect;
       rect.rect_change = 5;

       return 0;
   }

person aglasscage    schedule 06.05.2015    source источник
comment
Похоже, вы не включили в проект файл rect.cpp. Проверьте, как вы строите проект.   -  person Vlad from Moscow    schedule 06.05.2015
comment
Похоже, вы забыли включить rect.cpp при создании исполняемого файла.   -  person R Sahu    schedule 06.05.2015
comment
Можете ли вы включить все команды, которые вы используете для компиляции вашего программного обеспечения?   -  person Bill Lynch    schedule 06.05.2015
comment
У меня та же ситуация, что и у компилятора: я не могу найти определение SDL_Rect.   -  person celtschk    schedule 06.05.2015
comment
У вас смесь SDL_Rect и Rect. Это специально?   -  person R Sahu    schedule 06.05.2015
comment
Обновлен со всей информацией, о которой я могу думать. Дайте мне знать, если вам, ребята, нужно что-нибудь еще. Я ценю всю помощь. И отвечая на поставленный выше вопрос: да, это специально. Прямой код был предоставлен мне моим профессором, и я пытаюсь добавить к нему статические члены (он работал до того, как я добавил статические переменные и попытался их использовать)   -  person aglasscage    schedule 06.05.2015
comment
Вам нужно включить SDL_rect.h, чтобы получить определение SDL_Rect.   -  person RichieHindle    schedule 06.05.2015


Ответы (1)


Спасибо за всю помощь, и спасибо RichieHindle за ответ.

Мне нужно было #include "SDL_gfxPrimitives.h", чтобы заставить его работать. Забавно, потому что я некоторое время работал над этим проектом, и компилятор вообще не жаловался, пока я не попытался добавить статический член.

Спасибо еще раз!

person aglasscage    schedule 06.05.2015