SDL, заголовки и странные ошибки ..?

Я изучаю SDL, и до сих пор все работало нормально. Всякий раз, когда я пытаюсь скомпилировать свой код, я получаю следующую ошибку:

Undefined symbols for architecture x86_64:
"Tile::draw(SDL_Surface*)", referenced from:
_SDL_main in ccTWWnIW.o
"Tile::update()", referencedfrom:
_SDL_main in ccTWWnIW.o
"Tile::Tile(int)", referenced from:
_SDL_main in ccTWWnIW.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

Что странно, так это то, что это происходит только тогда, когда я включаю заголовок «level.h» в мой бит кода «player.cpp» … в то время как включение «level.h» в мою основную программу не вызывает компилятор в все. Я использую класс, определенный в «level.h» в обеих основных программах — для создания экземпляров плиток, их обновления и перетаскивания их на экран — и в «player.cpp» — для проверки столкновений. Я закомментировал все части «player.cpp», которые использовали любые компоненты, определенные в «level.h», и все еще получал ошибки компилятора. Я включил те же заголовки SDL, что и в «player.cpp», и соответственно установил флаги на моем компиляторе, так что я действительно не понимаю, почему появляется сообщение «ld: symbol (s) not found for Architecture x86_64») ,

Биты «level.cpp», на которые ссылаются в сообщении об ошибке:

#include "SDL.h"#include "SDL_image.h"#include <iostream>
#include "Variables.h"#include <cstdlib>
#include "level.h"
class Tile{
public:
int damage;
int velocity;
bool solid;
SDL_Rect position;
SDL_Rect crop;
SDL_Surface* image;
Tile(int type);
~Tile();
bool update();
void draw(SDL_Surface* target);
};

Tile::Tile(int type){
if(type == 0){
damage = 0;
velocity = 20;
solid = true;
position.x = 600;
position.y = rand() % 500;
SDL_Surface* temp_image = IMG_Load_RW(SDL_RWFromFile("spritesheet.png", "rb"), 1);
image = SDL_DisplayFormatAlpha(temp_image);
SDL_FreeSurface(temp_image);
crop.x = 0;
crop.y = 0;
crop.w = 50;
crop.h = 50;
}
}

bool Tile::update(){
position.x = position.x - velocity;
if(position.x <= 0) {
position.x = 700;
position.y = rand()%500;
}
else return 0;
}

void Tile::draw(SDL_Surface* target){
SDL_BlitSurface(image, &crop, target, &position);
}

Я знаю, что стиль кодирования — это чушь, это только то, что я бездельничаю и изучаю SDL.

0

Решение

Я не уверен, на чём именно основана эта проблема, но есть несколько вещей, которые вы должны сделать.

Поместите защиту заголовков вокруг ваших заголовков, например. в level.h вы бы хотели что-то вроде:

#ifndef LEVEL_H_
#define LEVEL_H_

наверху и:

#endif

внизу. Это сделано для того, чтобы символы не определялись несколько раз, когда файл включен в несколько разных исходных файлов.

Во-вторых, вам нужно поместить определения классов в файлы заголовков (.h), а не в файлы .cpp. Вероятно, в вашем случае было бы гораздо приятнее переместить материал листов в его собственные файлы (tile.h, tile.cpp), но в любом случае определение класса листов должно быть в файле заголовка.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]