首页 > 解决方案 > G ++:对类::方法的未定义引用

问题描述

我正在尝试使用 SDL2 为我的程序创建一个接口。问题是当我包含我的 .h 文件时,编译器无法找到 .cpp ,即使我链接了所有内容。我在互联网上找到的所有方法都不起作用,在 Visual Studio 中编译时,代码工作得非常好。更奇怪的是,当我试图让我的类从其他类继承时,我从父类中得到同样的错误。我也在使用最新版本的 Ubuntu。此外,我安装了 SDL2 所需的所有库。这是错误:

/usr/bin/ld: /tmp/ccWHZ70h.o: in function `interface::init(char const*)':
interface.cpp:(.text+0xd6): undefined reference to `interface::renderer'
/usr/bin/ld: interface.cpp:(.text+0xdd): undefined reference to `interface::renderer'
/usr/bin/ld: interface.cpp:(.text+0x106): undefined reference to `interface::renderer'
/usr/bin/ld: /tmp/ccWHZ70h.o: in function `interface::LoadTexture(char const*)':
interface.cpp:(.text+0x1bd): undefined reference to `interface::renderer'
/usr/bin/ld: /tmp/ccWHZ70h.o: in function `interface::DrawTexture(SDL_Texture*, SDL_Rect, SDL_Rect)':
interface.cpp:(.text+0x20d): undefined reference to `interface::renderer'
collect2: error: ld returned 1 exit status
make: *** [MakeFile:2: all] Error 1

我在这个文件上使用 make -f 编译:

all:
        g++ mainClient.cpp client.cpp interface.cpp -lSDL2main -lSDL2 -lSDL2_image -lSDL2_mixer -lSDL2_ttf -o client.exe
clean:
        rm -f *~client-exe

没有接口类,代码工作得很好。这是 interface.h 代码:

#pragma once
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <SDL2/SDL_mixer.h>
#include <SDL2/SDL_ttf.h>
#include <SDL2/SDL_render.h>
#include <iostream>
class interface
{
        private:
                int width, height;
                SDL_Window* window;
                bool state;
                static SDL_Renderer* renderer;
        public:
                interface(int w,int h);
                ~interface(){};
                int init(const char* titlu);
                void loop();
                void render();
                SDL_Texture* LoadTexture(const char* filename);
                void DrawTexture(SDL_Texture* tex, SDL_Rect imgRect, SDL_Rect destRect);

};

这是 interface.cpp 代码:

#include "interface.h"
interface::interface(int w,  int h)
{
        width = w;
        height = h;
        state = true;
}
int interface::init(const char* title)
{
        if(SDL_Init(SDL_INIT_EVERYTHING) == 0)
        {
                window = SDL_CreateWindow(title,SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,width,height,0);
                if(window == NULL)
                {
                        std::cout<<"Eroare la crearea ferestrei!\n";
                        state = false;
                }
                renderer = SDL_CreateRenderer(window,-1,0);
                if(renderer == NULL)
                {
                        std::cout<<"Eroare la crearea rendererului!\n";
                        state = false;
                }
                else
                {
                        SDL_SetRenderDrawColor(renderer,255,255,255,255);
                }
        }
        else
        {
                std::cout<<"ERROR AT INIT EVERYTHING\n";
                state = false;
        }
}

SDL_Texture* interface::LoadTexture(const char* filename)
{
        SDL_Surface* tempSurface = IMG_Load(filename);
        if(!tempSurface)
        {
                std::cout<<"Eroare la imaginea: "<<filename<<SDL_GetError<<std::endl;
        }
        SDL_Texture* tex = SDL_CreateTextureFromSurface(renderer,tempSurface);
        SDL_FreeSurface(tempSurface);
        return tex;
}

void interface::DrawTexture(SDL_Texture* tex, SDL_Rect imgRect,SDL_Rect destRec)
{
        SDL_RenderCopyEx(renderer,tex,&imgRect,&destRec,0,NULL,SDL_FLIP_NONE);
}

这是我包含 interface.h 的 mainClient.cpp 的代码:

#include "client.h"
#include "interface.h"
int main()
{
        client *Client = new client;
        interface *screen = new interface(800,600);
        screen->init("ReadsProfiler");
        Client->init();
        Client->loop();
}

如果我不使用 client.h,我会得到同样的错误,所以我也不会向其中添加代码。

标签: linuxoopg++sdl-2

解决方案


因为renderer是静态的,所以还需要在.cpp文件中声明。

将其添加到 interface.cpp,例如在#include "interface.h"

SDL_Renderer* interface::renderer;

推荐阅读