G++:对 class::method 的未定义引用
G++: Undefined reference to class::method
我正在尝试使用 SDL2 为我的程序创建一个界面。问题是,当我包含我的 .h 文件时,编译器无法找到 .cpp,即使我链接了所有内容。 None 我在互联网上找到的方法有效,并且在 visual studio 中编译时,代码工作得很好。更奇怪的是,当我试图让我的 classes 从其他人那里继承时,我从父 class 那里得到了同样的错误。我也在使用最新版本的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
代码在没有接口 class 的情况下工作得很好。
这是 inteface.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);
}
这是 mainClient.cpp 的代码,其中包含 interface.h:
#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;
我正在尝试使用 SDL2 为我的程序创建一个界面。问题是,当我包含我的 .h 文件时,编译器无法找到 .cpp,即使我链接了所有内容。 None 我在互联网上找到的方法有效,并且在 visual studio 中编译时,代码工作得很好。更奇怪的是,当我试图让我的 classes 从其他人那里继承时,我从父 class 那里得到了同样的错误。我也在使用最新版本的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
代码在没有接口 class 的情况下工作得很好。 这是 inteface.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);
}
这是 mainClient.cpp 的代码,其中包含 interface.h:
#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;