2012-11-21 45 views
2

我在Mac Mini上運行,2012年末(最新),64位,Intel Core i7 2.3 gHz HyperThreading x86_64,或者說我的電腦。我也暫時使用Code :: blocks,因爲Xcode(我更喜歡)的幫助更加稀疏,因爲我使用的是C++。也就是說,選擇的編程語言是C++,並且最終將擴展到Objective-C++,但那是另一天。爲什麼我無法使用C++在x86_64上的Mac上編譯SDL?

問題是這樣的:我正在嘗試編譯一個程序,我不太清楚還有什麼(這是一個模板,讓我們現在就說它是一個遊戲)。使用SDL 1.2.15,我在我的Mac上從源代碼編譯。 (我嘗試過使用SDLmain.m和SDL.h,但是這些代碼都是Objective-C的代碼,而且我沒有找到關於我是否可以用C++編寫代碼的好消息,所以放棄了。)我編譯的源代碼似乎工作得很好,Code :: Blocks可以編譯它的教程就好,它運行正常。但是,我似乎無法讓我的遊戲模板起作用。它編譯得很好,沒有錯誤或警告,但鏈接器不會這樣做。現在,我真的不確定什麼ld做什麼,我只知道它將代碼鏈接在一起。 (任何人想詳細說說嗎?)當代碼::塊到達它的鏈接步驟失敗此消息:

-------------- Clean: Debug in PyroLauncher --------------- 

Cleaned "PyroLauncher - Debug" 

-------------- Build: Debug in PyroLauncher --------------- 

Compiling: App.cpp 
Compiling: OnCleanup.cpp 
Compiling: OnEvent.cpp 
Compiling: OnInit.cpp 
Compiling: OnLoop.cpp 
Compiling: OnRender.cpp 
Linking console executable: bin/Debug/PyroLauncher 
Undefined symbols for architecture x86_64: 
    "_SDL_GetError", referenced from: 
     App::OnInit()  in OnInit.o 
    "_SDL_Init", referenced from: 
     App::OnInit()  in OnInit.o 
    "_SDL_PollEvent", referenced from: 
     App::OnExecute()  in App.o 
    "_SDL_Quit", referenced from: 
     App::OnCleanup()  in OnCleanup.o 
    "_SDL_SetVideoMode", referenced from: 
     App::OnInit()  in OnInit.o 
    "_main", referenced from: 
     start in crt1.10.6.o 
    (maybe you meant: _SDL_main) 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 
Process terminated with status 1 (0 minutes, 0 seconds) 
0 errors, 0 warnings 

其中有我當回事困惑。我只知道ld找不到我的本機架構x86_64。如果任何人都可以幫助我,將不勝感激。 我認爲解決方案可能是:(但我不知道該怎麼做。) SDL未編譯爲64位,因此無法使用64位代碼進行編譯。 SDL是爲Objective-C編譯的,因此不能與C++中的代碼一起使用。 我的代碼是32位,SDL是64位,並且它們不兼容。

+1

「我真的不知道LD不,我只知道它連接起來代碼(任何人想詳細說明?)「〜http://en.wikipedia.org/wiki/Linker_%28computing%29說比我好。編譯器「編譯」每個單獨的文件(檢查是否有錯誤,如果沒有,則生成大部分彙編代碼),並由鏈接器完成剩下的工作 - 文件A從文件B調用例程,鏈接器將添加該函數的地址插入編譯器爲文件A生成的代碼(dito數據)。編譯器對單個文件起作用,而鏈接器看到整個項目並將它們拼接在一起。 – Mawg

+1

更詳細的構建輸出會很有用,尤其是鏈接器行。 –

回答

1

你明白這裏發生了什麼?你的代碼正在調用鏈接器(ld)無法找到的函數。

兩個主要的可能性是你需要在你的項目中包含更多的文件,或者你需要定義一些宏。

在整個項目中搜索SDL_GetError()(和其他)的定義。如果你沒有找到它,那麼你需要找到聲明它幷包含它的文件。

如果你確實找到了它,那麼它可能會被#ifdef XXXX所包圍,你將不得不在你的項目選項中(而不是在你的代碼中)定義xxxx。如果沒有定義,大多數好的IDE(我使用NetBeans,Cygwin用於C +開發)將灰掉ifdef的內容,因此您可以立即查看是否屬於這種情況。

順便說一句,查看SDL網站的安裝說明。或者,您的下載可能有一個名爲「Install」或「Ins​​tall.txt」的文件,並且可能還有一個Makefile。如果是這樣,那麼在IDE中查找現有makefile中的Project/New ...選項。

希望這會有所幫助。

+1

迄今爲止這是一個相當不錯的答案。考慮到我在Windows上使用SDL的經驗,看起來您連接SDLmain.lib失敗了,是否有可能? – emartel

+0

謝謝你解釋說,我真的不知道到現在爲止做了什麼。我從源代碼編譯,也已經安裝了自制軟件,並完成了'brew install sdl'這似乎工作正常。我想我會嘗試在Xcode中包含SDLmain.m和.h文件,看看它們是否有效。如果有人仍然想知道,我會看到獲取鏈接器行和全部輸出。 – PyroAVR

+0

@PyroAVR最好的方式來感謝這個網站是有投票權的;-) – Mawg

0

您需要將文件SDLMain.m和SDLMain.h添加到您的項目中。 SDLMain文件包含粘合代碼,因此SDL代碼可以在Mac OS X上運行。您還需要將Cocoa框架鏈接到您的項目。 Mac版本的SDL是用Cocoa編寫的,因此您需要鏈接到Cocoa。鏈接Cocoa框架不會強制你使用Objective-C。你可以用C++寫你的遊戲。

如果你正在尋找的信息,在Xcode 4設置SDL,閱讀下面的文章:

Using SDL with Xcode 4

+0

那麼,我已經設法包括所有必要的文件和whatnot,但程序不會編譯。我轉向了Xcode,感謝Mark提到的教程。然而,SDLmain.m在Xcode中有大約20個錯誤,所以我想我必須等待SDL團隊修復這些錯誤。感謝大家的幫助。 – PyroAVR

+0

@PyroAVR呃,如果你得到的錯誤可能是你的結局。 SDL相當廣泛地使用(輕描淡寫)。 – Cubic

相關問題