SDL,标题和奇怪的错误..?

时间:2013-04-01 22:56:47

标签: c++ header g++ sdl symbols

我正在学习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

有什么奇怪的是它只发生在我的“player.cpp”位代码中包含“level.h”标题时...而在我的主程序中包含“level.h”却没有引发编译器。我在主程序中使用“level.h”中定义的类 - 实例化tile,更新它们并将它们blit到屏幕 - 以及“player.cpp” - 来检查冲突。我注释掉了“player.cpp”中使用“level.h”中定义的任何组件的所有部分,但仍然存在编译器错误。我已经包含了与“player.cpp”相同的SDL标头,并在我的编译器上相应地设置了标志,所以我真的不明白为什么“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。

1 个答案:

答案 0 :(得分:1)

我不确定具体问题是基于什么,但你应该做一些事情。

在标题周围放置标题保护,例如。在level.h中,你会想要类似的东西:

#ifndef LEVEL_H_
#define LEVEL_H_

在顶部,并且:

#endif

在底部。这是为了防止在多个不同的源文件包含文件时多次定义符号。

其次,您需要将类定义放入标题(.h)文件而不是.cpp文件。在你的情况下,将tile内容移动到它自己的文件(tile.h,tile.cpp)可能会更好,但无论哪种方式,tile类定义都需要在头文件中。