linux - 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,我会得到同样的错误,所以我也不会向其中添加代码。
解决方案
因为renderer
是静态的,所以还需要在.cpp文件中声明。
将其添加到 interface.cpp,例如在#include "interface.h"
:
SDL_Renderer* interface::renderer;
推荐阅读
- excel - 在 VBA 中定义 InStr
- create-react-app - 直接嵌套 URL 失败并出现错误“Uncaught SyntaxError: Unexpected token '<'” - Create React App/React-router-dom/Netlify
- templating - Nunjucks 嵌套对象数组字段打印
- freeze - 使用 files-from 选项时,RSync 挂了几个小时
- python - 我需要这样做,以便当您抓住单词的所有字母时,写下“结束”并停止游戏。(Python)
- scala - 如何在 scala/cats 中为 State[S, A] 实现 Applicative
- bad-request - Mule#4:RAML 无法解析转义字符中的 JSON
- java - Resilience4j 异常处理
- sql - 将每一行与另一列的对应行相加
- apexcharts - 在热图顶点图中,我们如何删除重复的 x 轴标签?