SDL错误 x86_64体系结构下未定义符号“_SDL_main”

12

我在我的Mac OS X上使用SDL Cocoa和Foundation框架编写C++程序时遇到了以下错误:

Undefined symbols for architecture x86_64:
  "_SDL_main", referenced from:
      -[SDLMain applicationDidFinishLaunching:] in SDLMain.o
ld: symbol(s) not found for architecture x86_64

当我运行以下代码时

#import <Foundation/Foundation.h>
#import <SDL/SDL.h>
#include "SDLMain.h"
int main(int argc, const char * argv[])
{
    SDL_Init(SDL_INIT_EVERYTHING);
    SDL_SetVideoMode(640,480,32,SDL_DOUBLEBUF);
    SDL_Event event;
    bool isRunning = true;
    while(SDL_PollEvent(&event)){
        if(event.type == SDL_QUIT){
            isRunning=false;
        }
    }

    SDL_Quit();
    return 0;
}

虽然我不知道出了什么问题,但当我进入SDLMain.m文件并注释掉这行代码时,情况似乎会改善。

status = SDL_main (gArgc, gArgv);

这个程序编译没有问题。但是它不能正常工作,窗口也没有像预期的那样打开。有什么想法吗?


你正在链接哪些库? - Joachim Isaksson
我正在与所有人链接。 - William Oliver
所有库都包含在SDK的64位版本中吗? - Joachim Isaksson
Cocoa和Foundation与Xcode一起提供,SDL除了64位的Mac没有其他选项。 - William Oliver
2个回答

20

我打赌你的main函数签名是不正确的。你使用的是:

int main(int argc, const char * argv[])
                   ^^^^^

但SDL_main.h需要

int main(int argc, char *argv[])

为什么?

你看,SDL在编译时会执行一项非常可怕的操作:将你的main函数重命名为SDL_main,注入自己的主函数,然后调用你的函数。

请注意,如果这个操作不起作用,那么可能是因为你使用了错误的标志进行编译。要确保使用正确的标志,请输入以下命令以获取标志:

$ sdl-config --cflags --libs

更多信息请参见包含SDL头文件会导致链接器错误


3
我遇到了同样的问题,即使我的主签名是正确的。我在这里找到了答案:SDL in XCode 4.3.2 SDLMain.o undefined symbols 结果发现问题在于我添加了SDLMain.m和SDLMain.h(根据libSDL网站上关于OS X框架的建议)到一个现有的SDL项目中,这扰乱了main函数。底线是,你不需要这些文件,只要你使用Cocoa -- SDL自己的测试应用程序也不使用它,并且在OS X上运行得很好。

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