我一直试图让一个 super 简单的 SDL 程序工作。我正在使用 Mac OS X Lion。我让 SDL 在 Snow Leopard 中工作,但它似乎不想在 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。我刚刚在另一个程序中看到的评论内容,我不确定我是否应该拥有它。
我应该如何让这个工作?
请您参考如下方法:
SDL 头文件重新定义 main
用宏。这是在 SDL_main.h 中:
#define main SDL_main
但这很好。 SDL 提供自己的
main()
然后调用您的版本的函数。因此,摆脱那些定义,它们使情况变得更糟,而不是更好。
如果您的项目是基于 Cocoa 的,那么您可能错过了包含
SDLmain.m
在你的项目中。这提供了 cocoa 友好的
main()
功能。如果您的项目是 native C++,那么我的猜测是您没有在项目中包含所有 SDL 库,因此链接器看不到 SDL 自己的
main()
.