【问题标题】:SDL, headers and strange errors..?SDL、标题和奇怪的错误..?
【发布时间】:2013-04-01 22:56:46
【问题描述】:

我正在学习如何使用 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”中定义的类——实例化图块,更新它们并将它们blit到屏幕上——以及在“player.cpp”中——来检查碰撞。我注释掉了使用“level.h”中定义的任何组件的“player.cpp”的所有部分,但我仍然得到编译器错误。我在“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。

【问题讨论】:

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


    【解决方案1】:

    我不确定基于此的确切问题是什么,但您应该做一些事情。

    在您的标题周围放置标题防护装置,例如。在 level.h 中,你会想要这样的东西:

    #ifndef LEVEL_H_
    #define LEVEL_H_
    

    在顶部,并且:

    #endif
    

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

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

    【讨论】:

    • 还有一件事,所有include都应该在.h文件中,cpp应该只包含它自己的.h文件。
    • 我猜你的意思是所有包含都应该包含一个h文件(例如#include“myfile.h”,而不是#include“myfile.cpp”)。并非所有#include 都应该在 in .h 文件中 - 通常最好在可以时转发声明,否则 #include。
    • 你能举个例子,什么时候最好包含在cpp中?
    • 如果你有一个类 A 的成员变量是一个指向类 B 对象的指针,那么你不需要在你的头文件中 #include "B.h" 因为那时编译器不关心 B 的任何细节,它只需要知道它存在。在这种情况下,最好只在 A 的标头中提供 B 的前向声明。在 A 的 .cpp 文件中,您可能想要使用 B 的一些功能,例如。调用它的方法。在这种情况下,现在您需要在 A.cpp 中 #include "B.h"。这有助于减少在头文件更改时需要重新编译的文件数量。
    • 我已经完成了 ifndef/define/endif。我把所有的类定义都移到了 .h 文件中,现在它编译得很好,谢谢!我不知道如果我没有将类定义放在正确的文件中,它们实际上可能会搞砸我的程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    相关资源
    最近更新 更多