我一直在尝试获得一个超级简单的SDL程序的工作。我用的是Mac OS X Lion。我已经让SDL在雪豹中工作,但它似乎不想在狮子中工作。到目前为止,我有这个:
#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。我刚才在另一个程序中看到的注释的东西,我不确定我是否应该拥有它。
我该如何让它工作?
SDL头文件用宏重新定义main
。在SDL_main.h:
#define main SDL_main
但这是好的。SDL提供自己的main()
函数,然后调用您的版本。因此,摆脱这些定义,它们只会让事情变得更糟,而不是更好。
如果你的项目是基于Cocoa的,那么你可能错过了在你的项目中包括SDLmain.m
。这提供了一个Cocoa友好的main()
函数。如果您的项目是原生c++,那么我的猜测是您没有在项目中包含所有SDL库,因此链接器没有看到SDL自己的main()
。
如果您正在使用SDL框架,您只需要添加文件SDLMain.h和SDLMain。
您可以在SDL磁盘映像的"dev -lite"文件夹中找到这些文件,您可以从这里下载:http://www.libsdl.org/release/SDL-1.2.15.dmg
这两个文件将为您提供一个cocoa友好的主例程,以便您的SDL应用程序可以成为一个行为良好的OS X应用程序。
SDL.h不包含SDL_main.h文件中的第一行应该是:
#include SDL_main.h
SDL_main重新定义main函数,然后进行自己的初始化,这是使SDL在OS X上工作所必需的
编译时,除了libSDL
我有相同的链接时间错误OP纯c++ &OpenGL应用程序,解决方案是使用来自https://github.com/Ricket/HelloSDL
的示例项目这让我添加了Cocoa库,但这本来是需要的,因为我的目标是iPhone。