簡體   English   中英

Xcode 4 構建成功,命令行構建失敗?

[英]Xcode 4 build succeeds, command line build fails?

我在 Xcode 4(最新的非測試版)中有一個項目,在 Xcode 本身構建時構建良好。 具體來說,Ld 命令正確使用派生數據目錄(其中放置構建產品,包括依賴的 static 庫)。

但是,當我從命令行構建同一個項目時,Ld 命令失敗,因為它試圖使用項目中的 /build 文件夾,而該文件夾沒有被填充。

我已經嘗試在父項目和從屬項目中調整我所知道的每個構建設置。

關於從哪里開始調試的任何想法? 我可以根據需要提供更多信息。

編輯 1:完整的 Xcode 構建命令:

xcodebuild -project AppName.xcodeproj -target AppName -configuration "Config Name"

其中AppNameConfig Name都是構建的正確值。

編輯 2:鏈接(Ld)命令。

當內置 Xcode (這個工作):

Ld /Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Products/Debug-iphonesimulator/AppName.app/AppName normal i386
cd /Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName
setenv MACOSX_DEPLOYMENT_TARGET 10.6
setenv PATH "/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/opt/local/bin:/usr/local/git/bin"
/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/llvm-gcc-4.2 -arch i386 -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk -L/Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Products/Debug-iphonesimulator -L/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName -F/Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Products/Debug-iphonesimulator -filelist /Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Intermediates/AppName.build/Debug-iphonesimulator/AppName.build/Objects-normal/i386/AppName.LinkFileList -mmacosx-version-min=10.6 -lxml2 -all_load -ObjC -licucore -Xlinker -objc_abi_version -Xlinker 2 -lMyClientLibrary -lxml2 -lsqlite3.0 -framework Security -framework MessageUI -framework QuartzCore -framework MediaPlayer -framework MapKit -framework CoreLocation -framework AudioToolbox -lz.1.2.3 -framework MobileCoreServices -framework SystemConfiguration -framework CFNetwork -framework UIKit -framework Foundation -framework CoreGraphics -o /Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Products/Debug-iphonesimulator/AppName.app/AppName

當使用上面的構建命令從命令行構建時(失敗):

Ld "build/AppName.build/Prod Ad Hoc-iphoneos/AppName.build/Objects-normal/armv6/AppName" normal armv6
cd /Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName
setenv IPHONEOS_DEPLOYMENT_TARGET 4.0
setenv PATH "/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Developer/usr/bin:/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin:/usr/X11/bin:/opt/local/bin"
/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 -arch armv6 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk "-L/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName/build/Prod Ad Hoc-iphoneos" -L/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName "-F/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName/build/Prod Ad Hoc-iphoneos" -filelist "/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName/build/AppName.build/Prod Ad Hoc-iphoneos/AppName.build/Objects-normal/armv6/AppName.LinkFileList" -dead_strip -lxml2 -all_load -ObjC -licucore -miphoneos-version-min=4.0 -lMyClientLibrary -lxml2 -lsqlite3.0 -framework Security -framework MessageUI -framework QuartzCore -framework MediaPlayer -framework MapKit -framework CoreLocation -framework AudioToolbox -lz.1.2.3 -framework MobileCoreServices -framework SystemConfiguration -framework CFNetwork -framework UIKit -framework Foundation -framework CoreGraphics -o "/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName/build/AppName.build/Prod Ad Hoc-iphoneos/AppName.build/Objects-normal/armv6/AppName"

返回:

ld: library not found for -lMyClientLibrary
collect2: ld returned 1 exit status
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1

好的,近 6 小時(可計費)后,我已經讓構建在 Xcode 和命令行(以及構建服務器上,本練習的重點)上正常工作。

在此過程中,我會修復一個問題只是導致另一個問題 - 我顯然會修復鏈接器/Ld 問題,只是導致編譯問題(“SomeClass undeclared (first use in this function)”或“SomeHeader.h: No such file或目錄”錯誤很常見)。

那是我幾乎調整了我能找到的所有設置的那個時候,所以很難說到底是什么錯誤以及究竟是什么修復了它。

我認為可能有幫助的事情如下:

  • 將構建轉換為使用 Xcode 工作區和方案(而不是項目和目標)
  • 重新排列工作區以將 App 項目和 static 庫作為兄弟姐妹(而不是作為父/子)
  • 更改了 Xcode 和工作區設置以使用目標中指定的構建位置
  • 更改應用程序和庫的構建產品路徑以使用../build(兩個項目文件都包含在主目錄的同級子文件夾中,因此讓它們構建到同一個文件夾中解決了原始鏈接器/Ld 命令問題,我認為
  • 編輯 App 方案以顯式構建 Library 目標,並在 App 目標之前構建它
  • 在 App 目標的 Build Phases 中,在“Link Binary With Libraries”下顯式添加庫
  • 將 Library's.a 文件引用的位置類型更改為“相對於構建產品”
  • 向庫項目添加了“復制標題”構建階段,將適當的標題添加到公共部分
  • 將 Library 項目的 Public Headers 文件夾路徑更改為“/include”
  • 將庫的安裝目錄更改為$(BUILT_PRODUCTS_DIR)
  • 將 App 目標的 Library Search Paths 和 User Header Search Paths 更改為$(BUILT_PRODUCTS_DIR) (遞歸)
  • 在我的 Jenkins 構建服務器上構建之前添加了一個 Clean 命令
  • 在構建命令中添加了顯式 SDK 和 Arch arguments
  • 從構建配置名稱中刪除了空格

最終構建命令如下所示:

xcodebuild -workspace ClientName.xcworkspace -scheme AppName -configuration "ProdAdHoc" -sdk iphoneos -arch "armv6 armv7"

我在調試此問題時使用的一些有用資源:

無論如何,我希望我已經在上面添加了足夠多的關鍵字,以便將來遇到任何類似構建問題的人偶然發現它並發現它很有用。 我不知道當我搬到 Xcode 4 時,我在 Xcode 3.x 中多次執行的工作流程變得如此混亂,希望 Apple 能夠在未來的版本中清理這個問題。

這對我來說是一次非常棒的學習經歷,經歷所有這些似乎確實解決了我之前遇到的自動完成問題。 我會說情況可能會更糟。 我仍然可以為 SharePoint 開發。

我昨天遇到了同樣的問題,並且能夠解決。 為了縮小對詹姆斯有用的范圍,我將指出我必須做的事情。 我必須添加一個工作區並切換到使用工作區/方案而不是項目/目標運行 xcodebuild。

使用工作空間/方案強制 xcodebuild 使用 DerivedData 文件夾,而不是主項目下的 build output 文件夾。 這允許 linker 找到相關的 static 庫。

這篇博文非常有幫助:

http://blog.carbonfive.com/2011/05/04/automated-ad-hoc-builds-using-xcode-4/

我在試驗文件時遇到此錯誤,我將@implementation 添加到.h 文件並將.m 文件留空。 我不相信這是你的錯誤,但如果其他人得到它,可能會檢查你沒有這樣做。

檢查您是否沒有在 header 文件中導入 .m 文件。 將.m 更改為 .h 為我解決了這個問題!

我不知道這是否對您有用,但就我而言,我有多個main.m文件。 我所要做的就是將一個main.m從目標中分離出來,它就可以工作了。 確保項目中的main.m不超過一個。

如果您查看構建日志,要求查看所有消息,您應該會看到一條簡潔的行,上面寫着“鏈接...”,幾乎沒有詳細信息。 但是,如果您右鍵單擊該行並 select “展開所有成績單”,您會得到一個非常詳細的行,告訴您從 XCode 中發出了什么命令。

這應該可以幫助您調試問題。

戴夫

我遇到了類似的異常,事實證明,在我清理了 project.pbxproj 中的 null 引用之后,我在 project.pbxproj 中獲得了一些(空)引用,命令行構建成功,就像之前的 xcode 一樣。 看看Xcode 4 項目:清理 pbxproj 文件的實用程序? 實用程序清理 pbxproj 文件

更多參考

突然間我在清潔后遇到了同樣的問題,起初我看到我驚慌失措:

linker command failed with exit code 1 (use -v to see invocation)

...但它變得非常容易修復,不需要命令行!

我在導航器中單擊了我的項目的根(頂部帶有帶有“A”的藍圖圖標的那個),然后單擊了項目部分(您也可以單擊目標部分),然后單擊底部的按鈕-middle 稱為“驗證設置”。

XCode 自己驗證了項目文件並告訴我問題是重復的目標定義,並提出修復它......瞧,問題消失了!

祝你好運!

我通過轉到“庫搜索路徑”解決了這個問題,並確保所有條目都正確。

就個人而言,我在開發static library時遇到了這個問題。 我有一個包含所有生產代碼的static library目標,以及一個將MyStaticLib.a文件作為框架拉入的測試目標。

測試在 Xcode 中運行得很好,但在使用xcodebuild的終端中卻沒有。 問題最終是static library目標正在為Standard architectures編譯,而測試目標想要為Standard architectures (including 64-bit)編譯。 將測試目標切換到Standard architectures修復了所有問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM