我一直试图让一个 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() .


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!