在Mac OS X Lion上使用Xcode 4安装SDL

7

我一直在尝试编写一个非常简单的SDL程序。我使用的是Mac OS X Lion操作系统。在Snow Leopard下我已经成功运行了SDL,但它似乎不想在lion下工作。到目前为止,我的代码如下:

#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;
}

当我尝试编译这段代码(在Xcode 4.1中),它会给出以下错误:

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)

如果我取消注释当前已注释的#ifdef部分,程序就可以编译,但是在SDL_SetVideoMode行接收到SIGABRT。我之前在另一个程序中看到这些注释的内容,不确定是否需要它们。
我该怎么让它工作?

你能提供XCode编译/链接程序所使用的命令吗?(顺便把那些#ifdef的东西去掉) - Brett Hale
@BrettHale 我不确定如何找到那个命令。它使用了 C++ 命令行应用程序模板的默认设置。编辑:我想我找到了:http://pastebin.com/zprm01Kp - Cole
4个回答

4
SDL头文件使用宏重新定义了main函数。这个宏定义在SDL_main.h文件中:
#define main    SDL_main

但这没关系。SDL提供了自己的main()函数,然后调用你的版本。因此,请摆脱那些定义,它们只会让情况变得更糟,而不是更好。
如果您的项目基于Cocoa,则可能忘记在项目中包含SDLmain.m。这提供了一个Cocoa友好的main()函数。如果您的项目是本地C++,那么我猜您没有在项目中包含所有SDL库,因此链接器没有看到SDL自己的main()

SDL.h是一个头文件,而不是一个库。SDL的代码存储在库或框架中(取决于您如何安装SDL)。您必须将库或框架添加到项目中,以便链接器可以获取SDL代码。 - Miguel Grinberg
好的,我想我已经做到了。在我的Xcode的“构建阶段”选项卡中,我在“链接二进制文件与库”部分中有SDL.framework。导入SDL.h只在我的main.cpp文件中。我应该在其他地方添加框架吗? - Cole
我添加框架的方法是将其作为项目树中的条目,与OpenGL.framework、Foundation.framework等一起。你可以尝试这个方法,或者从SDL网站安装SDL_devel包,然后使用XCode基于SDL模板创建一个新项目,并将你的文件移动到新项目中。希望这能有所帮助。 - Miguel Grinberg
检查构建日志并查看XCode如何调用链接步骤。链接器的命令必须包括“-framework SDL”选项。您可能将框架添加到了错误的目标,或者犯了其他类型的错误。 - Miguel Grinberg
嗯...它确实包括一个-framework SDL选项,以及一堆其他东西。我通过在命令行中运行g++ -o SDL\ test main.cpp -release sdl-config --cflags --libs``来使其工作,但是使用g++ -o SDL\ test main.cpp -release -framework SDL会给我带来Xcode的错误。sdl-config --cflags --libs的结果是-I/opt/local/include/SDL -D_GNU_SOURCE=1 -D_THREAD_SAFE -L/opt/local/lib -lSDLmain -lSDL -Wl,-framework,Cocoa。不过我仍然想让它在Xcode中工作。这样会更好。 - Cole
显示剩余4条评论

2
如果您正在使用SDL框架,只需将文件SDLMain.h和SDLMain.m添加到您的项目中(假设您已经将SDL.framework添加到了您的项目中)。
您可以在SDL磁盘映像的“devel-lite”文件夹中找到这些文件,您可以从此处下载该磁盘映像:http://www.libsdl.org/release/SDL-1.2.15.dmg 这两个文件将为您提供一个Cocoa友好的主程序,以使您的SDL应用程序成为一个行为良好的OS X应用程序。

1

SDL.h 不包含 SDL_main.h 你的文件第一行应该是:

#include SDL_main.h

SDL_main 重新定义了主函数,并进行了必要的初始化,以使 SDL 在 OS X 上正常工作。

编译时,除了 libSDL 外,还需要链接 libSDLmain。


这对我来说没有任何影响,但我真的不理解链接libSDLmain。我正在使用一个框架(Mac OS 10.7),此外我的SDL.h包括SDL_main.h。 - Cole

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接