2011-03-14 33 views
51

最近,我切換到Xcode4,並且當我編譯我的項目時,出現以下錯誤。Xcode4鏈接問題。文件是爲存檔構建的,而不是被鏈接的體系結構(arm6)

ld: warning: ignoring file /Users/myname/Library/Developer/Xcode/DerivedData/appname-hezrgyqimckztgbdlslkavphdclw/Build/Products/Debug-iphoneos/libTapkuLibrary.a, file was built for archive which is not the architecture being linked (armv6) 
Undefined symbols for architecture armv6: 
    "_OBJC_CLASS_$_TKLoadingView", referenced from: 
     objc-class-ref in RootViewController.o 

我打開TapkuLibrary並檢查它的架構設置爲 '標準(ARMv6的ARMv7的)'。

我能做些什麼來解決這個問題?

回答

111

我想清楚是什麼導致了這個問題。我將TapkuLibrary的「僅建立活動架構」從「是」更改爲「否」,並且它沒有問題。

+0

那麼你也只能用於armv7我猜... – Macmade 2011-03-14 20:31:56

+2

Ooops,我從Yes更改爲No. – Seunghoon 2011-03-14 20:56:43

+0

「構建僅活動架構」設置在哪裏? – Oscar 2011-03-21 06:47:59

6

嘗試刪除armv6架構,並僅爲armv7編譯它。

+3

這也解決了這個問題,但我不想限制我的應用程序到支持armv7的新設備。謝謝! – Seunghoon 2011-03-14 20:29:10

+0

這適用於我,但我仍然希望支持較舊的設備,您是否有任何其他解決方案。 – 2012-06-21 15:21:59

+0

如何在Xcode中的靜態庫中刪除armv6或x86_64 archs?我可以通過像這樣的命令行來實現 - http://atnan.com/blog/2012/01/12/avoiding-duplicate-symbol-errors-during-linking-by-removing-classes-from-static-libraries - 但是Xcode怎麼做呢? – 2014-11-24 09:58:20

35

我能夠做的the accepted answer對面來解決這個問題 - 我將'Build Active Architecture Only'從NO更改爲YES。

+0

對我來說也是一樣。我想知道爲什麼這個工作... – AddisDev 2013-06-18 15:09:40

+0

同樣在這裏 - 與供應配置文件有點巫術也涉及。 :) – dijipiji 2013-10-24 11:13:54

+0

同樣在這裏......它像魅力一樣工作! – 2014-12-23 09:00:25

11

有同樣的問題。但我認爲原因不同。我正在使用爲模擬器構建的library.a文件,並試圖在設備上運行它..後來知道我需要不同的.a文件來模擬器和設備。我希望這可以幫助別人;)

For example, here I have imported different library files for device and simulator

+0

我有這個確切的問題。你是什​​麼意思不同的模擬器的.a文件? – Luda 2012-07-23 10:53:51

+0

在這裏我附上了一個截圖給你。如果您導入的項目中包含.a庫文件,則需要其中的兩個。一個是模擬器,另一個是設備。根據您的要求導入。 – Zaraki 2012-07-24 07:21:39

+0

您可以使用lipo命令行工具將兩個庫(模擬器和設備)編譯到同一個文件中。分別構建兩個版本(模擬器和構建版本以供歸檔),cd到構建它們的Build/Products目錄,並使用'lipo -create Release-iphoneos/libsbjson.a Debug-iphonesimulator/libsbjson.a -output libsbjson.a' – 2012-10-04 00:39:57

0

我試過上述所有的選項,並沒有奏效。

這是正確的答案:

簡單的拖放在您的項目的框架不會正確鏈接它(或東西沿着這些線路,在任何情況下)

你需要什麼do是在構建階段(點擊項目的藍色圖標,然後選擇目標下的項目名稱,然後選項卡Build Phase)中選擇要添加的框架,請參閱here以獲取更多參考。

+0

您的答案解決了一個單獨的問題。在這種情況下,庫已正確鏈接,但未針對所需的體系結構進行編譯。 – 2013-06-03 03:44:01

1

確保項目上的構建變體設置爲「正常」。

如果您正在構建包含其他項目的項目,請查看主項目的DerivedData文件夾。使用「lipo -info yourarchive.a」檢查歸檔文件。另外,檢查這些檔案的時間戳。您可能會發現這些庫沒有得到重建,或者您嘗試鏈接舊版本的歸檔,這是錯誤的架構。

在我的情況下,我關閉Xcode並刪除了我的主項目的DerivedData文件夾。當我重新打開Xcode 4中的主項目時,這強制完全重建。完全重建導致創建i386存檔(或找到正確版本)&模擬器版本以正確鏈接。

0

這些答案都不適合我。 (類似的警告消息,不同的靜態庫項目)。對我來說,它已經配置XCode來兌現目標的構建目錄,然後在導致該問題的本地build/目錄中生成目標。配置XCOde使用「派生數據」文件夾修復了它。

+0

你能提供關於你如何做到這一點的更多細節嗎? – 2014-01-06 20:20:04

+0

我希望我能記住,但它太久了。 – PEZ 2014-01-17 14:30:48

2

對我來說還有一件事是確保所有子項目的架構設置爲armv6和armv7,確保設置每個子項目的TARGET和PROJECT。清潔和重建所有東西后,它的工作沒有問題。

+0

這完全適合我,謝謝Andy。 – 2012-06-21 15:25:19

0

我對Three20庫有這個問題。最終爲我做的事情是將項目格式從Xcode 3.1切換到Xcode 3.2 - 將「僅構建主動拱」視爲「否」。

1

這爲我工作:

  1. 點擊違規框架的 '項目' 文件(xcodeproj)。

  2. 轉到框架「項目」(而不是「目標」)的「信息」選項卡。

  3. 展開'配置',並確保'調試'和'發佈'有2個配置 - 一個用於框架的'Project',另一個用於框架'Target'。在框架的情況下,'目標'編譯到一個圖書館而不是一個應用程序,所以很容易混淆。

  4. 「調試」應具備的項目設置爲「調試」和圖書館設置爲「共享」

  5. 「發佈」應該有項目設置爲「釋放」和圖書館設置爲「共享」

  6. 編譯,運行和享受。

  7. 如果您最終搞砸了整個項目,試圖弄清楚這一點,那麼您可能需要仔細檢查應用程序的項目構建階段(如Gon建議的那樣)。即使圖書館不存在於您的驅動器上,圖書館也應該以紅色突出顯示。如果沒有,只要它被設置爲'共享',你應該能夠再次添加它。

  8. 如果你確實真的弄壞了你的項目,那麼你可能會被迫按照Russes的建議吹掉DerivedData文件夾。另外,請檢查'Organizer',因爲Xcode有一種方法可以在整個地方節省垃圾。

  9. 哦,你檢查確保'armv6'是否有權利? :)

11

當我將XCode升級到4.5和iOS到iOS6時,遇到此問題。對於GMGridView,它剛剛發生。 不適用於模擬器,但僅適用於設備。

我通過以下步驟修復了這個: 1)進入GMGridView項目 - >構建設置 2)在設置 - >架構,選擇 「標準(ARMv7的,armv7s)」

然後清除所有(包括DerivedData)並重建。

希望它有幫助!

+0

非常感謝您分享!我對同一個庫有同樣的問題,並修復了它。 – adriandz 2012-09-24 18:10:26

+0

@adriandz歡迎您!樂於幫助! :) – sonoshin 2012-09-25 12:57:03

2

這解決了這個問題對我來說:

像three20一些外部庫沒有額外設置

構建設置 - > Architectures->所有的iOS SDK

值 「的ARMv6 ARMv7的」 那不同於標準的「armv7 armv7s」

下拉並選擇「標準」,它爲我工作。

2

我通過點擊「不友好」項目(在我的情況下爲GMGridView)來管理它。 在「體系結構」標籤中,我改變了某個值(我不記得已經有了,我想它是:)「armv7,armv6s」到「armv7,armv7」。 之後,它爲我工作。

1

如果我忽略文件警告 - 我會在被忽略的文件運行lipo -info找到它的架構如下

lipo -info libTapkuLibrary.a 

這將打印或者是i386,ARMv6的,ARMv7的,armv7s,x86_64的等一般該體系結構必須與您的目標構建平臺相匹配。例如。

  • I386 = IOS模擬器或32位的基礎上的Mac OS X
  • 的ARMv6 ARMv7的arm7s = IOS設備
  • x86_64的= 64位建立在Mac OS X

根據失配,要麼爲目標平臺重建庫,要麼更改目標平臺。

注意:對於胖二進制文件,lipo -info將打印上述體系結構的組合。

+0

非常感謝,我正在準確地搜索這個命令 – 2014-07-03 15:18:34

0

有同樣的問題,並試圖從頁面的不同解決方案無濟於事。 我還有一條消息告訴我我的庫不是爲arm64構建的。

最後如何我決心吧:

  • 打開project.pbxproj爲圖書館在文本編輯器
  • 搜索VALID_ARCHS
  • 有4次出現,2其中沒有包含arm64
  • 我在鏈中手動添加了arm64(VA​​LID_ARCHS =「arm64 i386 armv7 armv7s」)
  • 重建lib並且它可以正常

似乎有時XCode顯示的構建設置不完整,並且不完全對應於make文件。

相關問題