2011-11-22 10 views
7

私は非常にシンプルなSDLプログラムを動かそうとしてきました。私はMac OS X Lionを使用しています。 SDLがSnow Leopardで動作するようになっていますが、ライオンで作業したくないようです。私は現在、コメントしている#ifdefのもののコメントを解除した場合、Mac OS XでSDLを設定するXCodeを搭載したLion 4

Undefined symbols for architecture x86_64: 
    "_main", referenced from: 
     start in crt1.10.6.o 
    (maybe you meant: _SDL_main) 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

:私は(Xcodeの4.1で)このコードをコンパイルしようとすると

#include <iostream> 
#include "SDL/SDL.h" 

using namespace std; 

/* 
#ifdef main 
# undef main 
#endif 
*/ 

int main(int argc, char* args[]) 
{ 
    SDL_Surface* hello = NULL; 
    SDL_Surface* screen = NULL; 
    SDL_Init(SDL_INIT_EVERYTHING); 
    screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE); 
    hello = SDL_LoadBMP("hello.bmp"); 
    SDL_BlitSurface(hello, NULL, screen, NULL); 
    SDL_Flip(screen); 
    SDL_Delay(2000); 
    SDL_FreeSurface(hello); 
    SDL_Quit(); 

    return 0; 
} 

それは私に、このエラーを与える:これまでのところ私はこれを持っていますプログラムはコンパイルされますが、SDL_SetVideoMode行でSIGABRTを受け取ります。それは、私が別のプログラムで見たものをコメントした、私はそれを持っているかどうかわからない。

どうすればこの問題を解決できますか?

+0

プログラムをコンパイル/リンクするためにXCodeが発行するコマンドを提供できますか? (#ifdefのものを取り除いてください。) –

+0

@BrettHaleどうすればそのコマンドを見つけるのか分かりません。 C++ Editでコマンドラインアプリケーションテンプレートのデフォルトを使用しています。私が見つけたと思う:http://pastebin.com/zprm01Kp – Cole

答えて

4

SDLヘッダーファイルは、mainをマクロで再定義します。これはSDL_main.hにあります。

#define main SDL_main 

これは問題ありません。 SDLは独自のmain()関数を提供し、そのバージョンがあなたのバージョンを呼び出します。そのような定義を取り除くと、悪化しています。

あなたのプロジェクトがCocoaベースのプロジェクトの場合は、プロジェクトにSDLmain.mが含まれていない可能性があります。これは、ココアフレンドリーなmain()機能を提供します。プロジェクトがネイティブのC++の場合は、プロジェクトにすべてのSDLライブラリが含まれていないと思うので、リンカはSDL自身のmain()を見ていません。

+0

私のプロジェクトはC++です。 SDL_main.hの#define行が見えます。すべてのSDLライブラリを核種化していないということをどういう意味ですか? SDL。私がインクルードしているhは他のSDLヘッダーファイルもたくさん含んでいるので、必要なものを用意しておくべきです。他に何がインポートできますか?しかし、フレームワークには.cppファイルはありません。 – Cole

+0

SDL.hはライブラリではなくヘッダファイルです。 SDLのコードは、ライブラリまたはフレームワークに保存されます(SDLのインストール方法によって異なります)。リンカがSDLコードを取得できるように、ライブラリまたはフレームワークをプロジェクトに追加する必要があります。 – Miguel

+0

さて、私はそれをしたと思います。 Xcodeの「ビルドフェーズ」タブでは、「Link With Binary With Libraries」セクションにSDL.frameworkがあります。インポートするSDL.hは私のmain.cppにしかありません。フレームワークをどこかに追加するはずですか? – Cole

1

SDL.hは、ファイルの最初の行があるべきSDL_main.h が含まれていません。

#include SDL_main.h 

SDL_mainは、独自の初期化が必要とされない、その後、main関数を再定義し、SDLは、OSで作業を取得しますあなたは単にあなたのプロジェクトにファイルSDLMain.hとSDLMain.mを追加する必要がSDLフレームワークを使用している場合(仮定

X

コンパイル、あなたもlibSDL

+0

それは私のために何も変わることはありませんが、私はlibSDLmainのリンクを理解していません。私はフレームワーク(Mac OS 10.7)を使用しています。さらに、私のSDL.hにはSDL_main.hが含まれています。 – Cole

2

に加えてlibSDLmainにリンクする必要がありますyすでにあなたのプロジェクトにSDL.frameworkが追加されています)。

あなたがここにダウンロードすることができますSDLのディスクドライブ仮想化ソフトの「develの-LITE」フォルダ内のこれらのファイルを見つける:http://www.libsdl.org/release/SDL-1.2.15.dmg

これらの2つのファイルはあなたにココアフレンドリーメインルーチンを与えるだろう、あなたのSDLアプリケーションようにうまく動作するOS Xアプリケーションである可能性があります。

0

私は純粋なC++ &のOpenGLアプリケーションのためのOP、およびソリューションはhttps://github.com/Ricket/HelloSDL

からサンプルプロジェクトを使用していたので、これは私がターゲットにされて以来、私はココアのライブラリが、そのwould have been needed anywayを追加作られた同じリンク時のエラーが発生しましたiPhone。

関連する問題