c++中对静态变量的未定义引用
Posted
技术标签:
【中文标题】c++中对静态变量的未定义引用【英文标题】:Undefined reference to static variable in c++ 【发布时间】:2015-05-06 19:47:12 【问题描述】:我正在尝试在我的一个类中使用静态变量。我以前用过它们,没有问题。现在我收到此错误:
/tmp/ccg26aZi.o: 在函数'main'中: main.cpp:(.text+0x7482): 未定义对“Rect::rect_change”collect2 的引用:错误:ld 返回 1 个退出状态 make: *** [exe] 错误 1
有什么建议吗?谢谢!
更新:
我被告知检查我的 make 文件以确保 rect.cpp 包含在 exe 的制作中。我切换了文件夹,所以它在正确的位置。但是现在我得到了一系列全新的错误,我以前没有得到:
我检查了我的 make 文件并确定了 rect.cpp,然后将它移到了另一个运行 *.cpp 的文件夹中。但是现在我遇到了一组全新的错误:
includes/Rect.h:16:17: 错误:“SDL_Rect”没有命名类型 Rect(const SDL_Rect & r)
includes/Rect.h:16:28: 错误:ISO C++ 禁止声明没有类型的“r” [-fpermissive] Rect(const SDL_Rect & r)
includes/Rect.h:19:2:错误:“SDL_Rect”没有命名类型 SDL_Rect getSDL_Rect() ^ 包括/Rect.h:在构造函数中 ‘Rect::Rect(const int&)’:包括/Rect.h:17:9:错误:请求 ‘r’中的成员‘x’,它是非类类型‘const int’:x(r.x), y(r.y), w(r.w), h(r.h)
includes/Rect.h:17:17: 错误:请求‘r’中的成员‘y’,即 非类类型‘const int’:x(r.x), y(r.y), w(r.w), h(r.h)
includes/Rect.h:17:25: 错误:请求‘r’中的成员‘w’,即 非类类型‘const int’:x(r.x), y(r.y), w(r.w), h(r.h)
includes/Rect.h:17:33: 错误:请求‘r’中的成员‘h’,即 非类类型‘const int’:x(r.x), y(r.y), w(r.w), h(r.h)
这是我的 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;
【问题讨论】:
您似乎没有在项目文件rect.cpp中包含。检查你的项目建设。 您好像忘记在创建可执行文件时包含rect.cpp
。
你能包括所有你用来编译你的软件的命令吗?
我和编译器的情况一样:我找不到SDL_Rect
的定义。
需要包含“SDL_rect.h”才能得到SDL_Rect的定义。
【参考方案1】:
感谢所有帮助,感谢 RichieHindle 的回答。
我需要#include "SDL_gfxPrimitives.h" 让它工作。有趣的是,我已经在这个项目上工作了一段时间,编译器根本没有抱怨,直到我尝试添加一个静态成员。
再次感谢!
【讨论】:
以上是关于c++中对静态变量的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章