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++中对静态变量的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章

通过添加 0 修复对静态成员变量的未定义引用

为啥在使用静态方法时取消引用 nullptr 而不是 C++ 中的未定义行为?

C++ 静态成员变量的引用

C++ 静态成员变量的引用

C++ 静态成员变量的引用

静态成员