1

我已经设置了一个用于构建我的软件的系统,使用生成文件和命令行工具。

我已经能够轻松地修改 makefile 以支持我的 Mac(现在是 10.7.4),所以我试图让我的代码独立于 XCode 工作。一旦我开始将东西移植到 iOS,我就会处理 XCode。我希望 makefile 解决方案(虽然我的代码库仍然可以通过所述 makefile 管理)为我提供更好的可移植性和自动化选项。

我正在体验这里描述的内容。代码编译并在运行时遇到问题。

起初我使用的-framework SDL是 SDL 站点上二进制下载的 SDL 框架 ( ),所以我想我可以通过从源代码正确构建 SDL 来解决这个问题。我已经这样做了,现在正在链接到libSDL.aand libSDLMain.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?是否有一些我可以调用sharedApplication的 C/C++ 包装函数?

4

3 回答 3

2

如果您使用libSDLmain或 include链接SDLMain.m,则您的入口点必须命名为 SDL_main :

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

extern "C"考虑到您使用的是 C++ 的事实。)

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

于 2012-06-10T00:04:19.330 回答
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);
}

但是,如您所见,这不是很优雅。

于 2012-06-10T00:10:50.777 回答
0

RavuAlHemio 应归功于他,因为他为我指出了有关 SDL 正在使用入口点做什么(试图做什么)的足够信息。然后我稍微编辑了我的代码,从

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

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

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

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

于 2012-06-10T00:15:12.167 回答