2012-06-09 56 views
1

我有一個系統,用於使用makefile和命令行工具構建已經設置好的軟件。讓SDL在C++入口點上工作在OSX上

我一直很容易修改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

回答

0

很多信用都應該發給RavuAlHemio,因爲他向我指出了關於SDL在入口點做什麼(嘗試做)的足夠信息。然後我編輯的代碼略有下降,從

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

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

唯一的原因,我已經是第一種方式通過MinGW的是,因爲在Windows上(而不是Linux)的輸出和錯誤重定向到文件而不是放在終端上。我現在必須爲此提出一個更優雅的解決方案。

無論如何,這已經解決了這個問題。

+0

是的,這是SDLmain不得不在Windows上執行的魔術的後果,以某種方式跟蹤標準I/O,但每次啓動時都不會彈出煩人的終端窗口。 – RavuAlHemio

2

如果用libSDLmain鏈接,或包括SDLMain.m,你的切入點將被命名爲SDL_main代替:(該extern "C"考慮到您使用的是C++的事實)

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

包含在libSDLmainSDLMain.m中的「真實」main進行必要的Mac專用準備,然後調用SDL_main

+0

那麼爲什麼我的代碼在與'libSDLMain.a'鏈接時編譯? –

+0

「SDL_main.h」頭部包含一個將您的'main'函數重命名爲'SDL_main'的宏。 – RavuAlHemio

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); 
} 

然而,正如你所看到的,這並不是很優雅。