11

MacOSXでSDLCocoaおよびFoundationフレームワークでC++を使用しています。次のエラーが発生します

Undefined symbols for architecture x86_64:
  "_SDL_main", referenced from:
      -[SDLMain applicationDidFinishLaunching:] in SDLMain.o
ld: symbol(s) not found for architecture x86_64

次のコードを実行すると

#import <Foundation/Foundation.h>
#import <SDL/SDL.h>
#include "SDLMain.h"
int main(int argc, const char * argv[])
{
    SDL_Init(SDL_INIT_EVERYTHING);
    SDL_SetVideoMode(640,480,32,SDL_DOUBLEBUF);
    SDL_Event event;
    bool isRunning = true;
    while(SDL_PollEvent(&event)){
        if(event.type == SDL_QUIT){
            isRunning=false;
        }
    }

    SDL_Quit();
    return 0;
}

SDLMain.mファイルにアクセスしてこのコード行をコメントアウトすると、何が問題なのかわかりません。

status = SDL_main (gArgc, gArgv);

プログラムは問題なくコンパイルされます。ただし、機能しません。想定どおりにウィンドウが開きません。何か案は?

4

2 に答える 2

19

main関数のシグネチャが間違っているに違いありません。あなたが使う:

int main(int argc, const char * argv[])
                   ^^^^^

しかし、SDL_main.hは

int main(int argc, char *argv[])

なんで?

ご覧のとおり、SDLはコンパイル時に非常に恐ろしいことを行います。つまり、関数の名前をに変更し、独自のメイン関数を挿入して、関数を呼び出しますmainSDL_main

これが機能しない場合は、間違ったフラグでコンパイルしている可能性があることに注意してください。確かに、次のように入力してフラグを取得します。

$ sdl-config --cflags --libs

詳細については、「SDLヘッダーを含めるだけでリンカーエラーが発生する」を参照してください。

于 2013-02-03T01:34:22.183 に答える
3

私の主な署名は正しいのに、私は同じ問題を抱えていました。私はここで答えを見つけました:XCode4.3.2のSDLSDLMain.o未定義のシンボル

問題が判明したのは、mainを台無しにした既存のSDLプロジェクトにSDLMain.mとSDLMain.h(OSXフレームワークに関するlibSDLWebサイトの提案による)を追加したことです。結論として、Cocoaを使用しているという理由だけでこれらのファイルは必要ありません。SDL独自のテストアプリもそれを使用せず、OSXで問題なく実行されます。

于 2016-08-20T02:17:50.390 に答える