2014-12-22 173 views
5

我正在編寫一個具有多個子目錄的應用程序。我創建了一個Makefile結構,以便子目錄編譯文件並執行「ar rvs」和「ranlib libxxx.a」以創建歸檔到父目錄以進行鏈接。OS X上的Gcc:架構x86_64的未定義符號

但是「ld」命令正在運行到以下問題。

ld: warning: ignoring file ./libxxx.a, file was built for archive which is not 
the architecture being linked (x86_64): 
./libxxx.a Undefined symbols for architecture x86_64: 

我使用的是Mac OS X的gcc 10.10.1

我讀了這麼多的帖子。我想「GCC -arch I386」,然後我遇到了同樣的錯誤了i386

Undefined symbols for architecture i386: 

我安裝GCC-4.9.2,並使用它,而不是默認的gcc,沒有運氣嘗試。我嘗試使用x86_64-apple-darwin14.0.0-g ++ - 4.9.2,這也沒有幫助。

回答

1

您看到的錯誤意味着您在構建中混合了i386和x86_64代碼,並且您需要保持一致。除非有一個令人信服的理由否則(我會好奇地知道它是什麼),你應該只編譯64位的所有東西。在Mac上使用gcc,這通常是默認設置,但您可以通過在彙編中添加-m64標誌來強制執行此操作。一種做法是在make命令行上設置CC="gcc -m64";還有其他更好的方法,但細節取決於您的makefile內容。

解決方法:首先,刪除您在項目區域中構建的所有庫和目標代碼(也許make clean將執行此操作 - 如果您編寫了clean目標)。然後,放棄CC或其標誌(CFLAGS最終,但CFLAGS的生成取決於makefile)的值,以便執行64位編譯。然後確保你在所有的編輯中都使用它。如果您沒有看到-m64,則說明您有問題。

如果您必須使用32位,請將-m32替換爲-m64

以上討論假設您使用gcc來運行ld命令。如果你不是,那麼直到你使用gcc來運行ld命令爲止。在我看來,對於你的生活你有更好的事情,而不是解決如何正確運行ld命令;我當然有。

+0

謝謝你的迴應。我試過「CC = gcc -m64」,我也用gcc來運行ld命令。但結果是一樣的。我只試過-m32選項,看看它是否有效,如果我使它一致,但沒有其他原因。 – newprogrammer

+0

除非我們看到一個能夠再現問題的最小化生成文件,否則沒有人可以爲您提供更多幫助。閱讀如何創建一個MCVE([如何創建最小,完整和可驗證示例?](http://stackoverflow.com/help/mcve))或SSCCE([Short,Self-Contained,Correct Example] (http://sscce.org/)) - 同一個想法的兩個名稱和鏈接。你的MCVE代碼應該可能是庫的一個最小源文件(和頭文件)('void libfunc(void){printf(「%s叫\ n」,__func__);}',並且你的主程序調用了庫函數,加上一兩個makefile文件,具體取決於事情的佈局。 –

+0

謝謝,請看看它。 – newprogrammer

相關問題