0

私は 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」で定義されたクラスを使用します-タイルをインスタンス化し、それらを更新して画面にブリットします-そして「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 をいじって学習しているだけです。

4

1 に答える 1

1

正確な問題がこれに基づいているかどうかはわかりませんが、やるべきことがいくつかあります。

ヘッダーの周りにヘッダーガードを配置します。level.h では、次のようなものが必要です。

#ifndef LEVEL_H_
#define LEVEL_H_

上部にあり、次のとおりです。

#endif

底に。これは、ファイルが複数の異なるソース ファイルに含まれている場合に、シンボルが複数回定義されるのを防ぐためです。

次に、クラス定義を .cpp ファイルではなくヘッダー (.h) ファイルに入れる必要があります。あなたのケースでは、タイルのものを独自のファイル (tile.h、tile.cpp) に移動する方がおそらくはるかに良いでしょうが、いずれにしてもタイル クラス定義はヘッダー ファイルにある必要があります。

于 2013-04-01T23:28:12.583 に答える