我有一个用于构建我的软件的系统,使用makefile和命令行工具。
我很容易修改makefile来支持我的Mac(现在是10.7.4),所以我试图让我的代码独立于XCode工作。一旦我开始将东西移植到iOS,我将处理XCode。我希望makefile解决方案(虽然我的代码库仍然可以通过makefile管理),这为我提供了更好的可移植性和自动化选择。
我正在体验到here所描述的内容。代码编译和运行时遇到的问题。
起初我在SDL网站上使用二进制下载的SDL框架(-framework SDL
),所以我想通过从源代码正确构建SDL来解决问题。我已完成此操作,现在正在关联libSDL.a
和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?是否有一些C / C ++包装函数可以调用sharedApplication
?
答案 0 :(得分:2)
如果您与libSDLmain
关联或包含SDLMain.m
,则您的入口点必须改名为SDL_main:
extern "C" int SDL_main(int argc, char **argv)
{
}
(extern "C"
考虑到您使用C ++这一事实。)
main
或libSDLmain
中包含的“真实”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被重定向到文件而不是放在终端上。我现在必须为此提出一个更优雅的解决方案。
无论如何,这已经解决了这个问题。