让SDL在带有C ++入口点的OSX上工作

时间:2012-06-09 23:43:07

标签: c++ objective-c macos opengl sdl

我有一个用于构建我的软件的系统,使用makefile和命令行工具。

我很容易修改makefile来支持我的Mac(现在是10.7.4),所以我试图让我的代码独立于XCode工作。一旦我开始将东西移植到iOS,我将处理XCode。我希望makefile解决方案(虽然我的代码库仍然可以通过makefile管理),这为我提供了更好的可移植性和自动化选择。

我正在体验到here所描述的内容。代码编译和运行时遇到的问题。

起初我在SDL网站上使用二进制下载的SDL框架(-framework SDL),所以我想通过从源代码正确构建SDL来解决问题。我已完成此操作,现在正在关联libSDL.alibSDLMain.a。这反过来要求我包含这些额外的框架以成功编译(我根据sdl-config --static-libs的输出提出了列表:

-framework Cocoa -framework IOKit -framework AudioToolbox -framework AudioUnit -framework Carbon -framework ApplicationServices 

但是我仍然遇到同样的问题,文章解释说这与遗漏这个问题有关:

[NSApplication sharedApplication];

我的代码没有Obj-C代码。不过,我很乐意将一些Obj-C插入其中。我添加了其中一个软件包附带的SDLMain.m,但链接器存在问题:ld: duplicate symbol _main

好的,所以我不会轻易放弃。

我遗漏的小部分是什么让我初始化我的NSApplication?有没有办法在没有单独的源文件(来自我的Main.cpp)的情况下进行,现在必须是Obj-C?是否有一些C / C ++包装函数可以调用sharedApplication

3 个答案:

答案 0 :(得分:2)

如果您与libSDLmain关联或包含SDLMain.m,则您的入口点必须改名为SDL_main:

extern "C" int SDL_main(int argc, char **argv)
{
}

extern "C"考虑到您使用C ++这一事实。)

mainlibSDLmain中包含的“真实”SDLMain.m进行必要的特定于Mac的准备,然后调用SDL_main

答案 1 :(得分:2)

还有一个纯粹的C解决方案:执行编译器的工作,将Objective-C调用降级为C调用或一组C调用。

#include <objc/runtime.h>
#include <objc/message.h>

static void createSharedApplication(void)
{
    id myNSApplication = objc_getClass("NSApplication");
    SEL mySharedApplication = sel_registerName("sharedApplication");
    id (*myMsgSend)(id, SEL) = (id (*)(id, SEL))objc_msgSend;

    myMsgSend(myNSApplication, mySharedApplication);
}

然而,正如您所看到的,这不是很优雅。

答案 2 :(得分:0)

很多功劳应该归功于RavuAlHemio,因为他向我指出了关于SDL正在做什么(试图做)与入口点的充分信息。然后,我从

稍微编辑了我的代码
#undef main
int main(int argc,char *argv[]) {

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

我采用第一种方式的唯一原因是因为在Windows上通过MinGW(但不是Linux),stdout和stderr被重定向到文件而不是放在终端上。我现在必须为此提出一个更优雅的解决方案。

无论如何,这已经解决了这个问题。