2009-10-08 31 views
1

我一直在試圖在我的Mac(10.5)上構建logstalgia項目(http://code.google.com/p/logstalgia/)。我沒有正確地將它鏈接到系統庫,而是將所有依賴關係構建並添加到項目中。我對此很陌生,但我確實認爲自己做得對,主要是因爲我有兩位經驗豐富的朋友這麼說。未定義的符號_main當試圖在mac上構建logstalgia

添加框架刪除了所有的編譯錯誤,但我仍然收到鏈接錯誤。它似乎無法找到main()函數。我已經驗證了我將main.cpp包含在要編譯的源代碼中(使用XCode),並且沒有意外的雙重聲明。我也驗證了主函數是正確聲明的(沒有丟失括號等)。

這就好像XCode沒有以正確的順序鏈接。任何幫助將非常感激,我真的很高興能下降到一個單一的錯誤! (希望解決這個問題不會打開水閘)。

感謝, 漢密爾頓

PS - 我可以肯定地提供的Xcode項目的zip如果有人願意看!

Checking Dependencies 

Ld "/Users/hamiltont/Downloads/logstalgia-0.9.2 2/Untitled/build/Debug/Untitled" normal i386 
    cd "/Users/hamiltont/Downloads/logstalgia-0.9.2 2/Untitled" 
    setenv MACOSX_DEPLOYMENT_TARGET 10.5 
    /developer/usr/bin/g++-4.0 -arch i386 -isysroot /developer/SDKs/MacOSX10.5.sdk "-L/Users/hamiltont/Downloads/logstalgia-0.9.2 2/Untitled/build/Debug" -L/sw/lib "-L/Users/hamiltont/Downloads/logstalgia-0.9.2 2/Untitled/../../pcre-7.9/.libs" -L/opt/local/lib -L/sw/lib "-F/Users/hamiltont/Downloads/logstalgia-0.9.2 2/Untitled/build/Debug" -F/Users/hamiltont/Downloads/logstalgia-0.9.2 -F2/src/SDL.framework "-F/Users/hamiltont/Downloads/logstalgia-0.9.2 2/Untitled" -filelist "/Users/hamiltont/Downloads/logstalgia-0.9.2 2/Untitled/build/Untitled.build/Debug/Untitled.build/Objects-normal/i386/Untitled.LinkFileList" -mmacosx-version-min=10.5 -framework OpenGL -lpcre -lSDL -lSDL_image-1.2.0 -prebind -o "/Users/hamiltont/Downloads/logstalgia-0.9.2 2/Untitled/build/Debug/Untitled" 
Undefined symbols: 
    "_main", referenced from: 
     start in crt1.10.5.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 
+0

PS - 類似的帖子: http://stackoverflow.com/questions/1494407/undefined-symbol-main-when-trying-to-build-shared-library-g-mac(不是試圖建立一個共享庫) http://stackoverflow.com/questions/550455/compile-error-undefined-symbols-main-referenced-from-start-in-crt1-10-5-o(可能同樣的問題,我自己,但我不不知道如何驗證) – Hamy 2009-10-08 21:58:31

回答

1

我得到這個錯誤消失。如果我明白,基本上SDL會重新命名主函數,以便它可以執行一些操作,然後運行應用程序,然後清理。原來,如果你在Xcode中編譯,你的必須使用ObjectiveC來編譯你的應用程序。

在Xcode中,告訴鏈接器嘗試和使用SDL_main(),而不是僅僅main()不起作用(由於某些技術原因,有點超出了我)。所以,你包含一些Objective C文件。在Oc中,你可以明確地說出你的主類名字是什麼。因此,您包含的Objective C文件似乎只會讓Xcode知道尋找SDL_main()

總之,這與Logstalgia無關,但完全是使SDL在Xcode中正確鏈接的問題。 This link正在談論這個問題。 SDLMain.h和SDLMain.m是Objective C文件。如果您找不到它們,請嘗試通過googleing「在Xcode中設置SDL模板」。我在Xcode中安裝了模板,使用它們中的一個來創建一個空的項目,它將編譯,鏈接和運行(並立即執行任何操作!),然後將我想要的項目文件添加到預配置的項目中。

謝謝!

0

仔細檢查鏈接文件列表以確保main.cpp中的目標文件是存在有:

/Users/hamiltont/Downloads/logstalgia-0.9.2 2/Untitled/build/Untitled.build/Debug/Untitled.build/Objects-normal/i386/Untitled.LinkFileList 

您可能還需要預處理的main.cpp,以確保主要不不經意地重命名(通過流氓宏)或省略(通過流氓#if)。

+0

fbrereto, 感謝您的快速回復。我檢查了LinkFileList,並且main.o是第一個條目。另外,我證實主文件沒有被宏忽略(幸運的是,它沒有在任何宏中定義)。我不知道如何檢查它是否被重命名。在build文件夾中有一個main.o,這似乎表明它不是,但我可能在這裏是錯誤的 – Hamy 2009-10-08 22:09:12

+0

我建議那些主程序的檢查,而不是main.cpp文件 - 對於那裏的混淆抱歉。您可以通過在XCode中右鍵單擊文件並從上下文菜單中選擇選項來預處理文件。一旦輸出彈出,你會想滾動到文件的最底部 - 它會很大!確保主要看起來應該是,它a)存在和b)被稱爲你所期望的。 – fbrereto 2009-10-08 23:26:46

+0

fbrereto, 我認爲你對流氓宏是正確的!我在這方面做了一些工作 - 一個nm main.o | grep main只顯示_SDL_main 我進入了SDL框架頭文件,在SDLmain.h中,我看到: /*應用程序的main()函數必須使用C鏈接調用, ,應聲明如下: 的#ifdef __cplusplus 的extern 「C」 #ENDIF \t INT主(INT的argc,字符* argv的[]) \t { \t} */ 的#define主\t SDL_main /*原型爲應用程序的main()函數*/ extern C_LINKAGE int SDL_main(int argc,char * argv []); 任何想法我需要做什麼? – Hamy 2009-10-08 23:29:50

相關問題