2009-11-04 47 views
7

我有一個自定義框架,遵循Apple框架編程指南>>Installing your framework中的建議我安裝在/ Library/Frameworks中。我這樣做是通過添加一個運行腳本生成階段使用以下腳本:安裝自定義可可框架的最佳方法

cp -R build/Debug/MyFramework.framework /Library/Frameworks 

在我的項目,我則像這樣針對/庫/框架/ MyFramework鏈接並將其導入在我的課:

#import <MyFramework/MyFramework.h> 

這個作品非常好,但我總是在我的調試器控制檯看到以下消息:

加載程序到調試...... sharedlibrary應用負載規則所有 警告:無法讀取「/Users/elisevanlooij/Library/Frameworks/MyFramework.framework/Versions/A/MyFramework」的符號(未找到文件)。 警告:無法讀取「MyFramework」中的符號(尚未映射到內存中)。 已加載程序。

顯然,編譯器首先查找/用戶/ elisevanlooij /庫/框架,找不到MyFramework,然後查找在/ Library /框架,確實發現MyFramework,並繼續在其快樂的方式。到目前爲止,這已經比實際的問題更令人煩惱,但是當運行單元測試時,gdb會停止(未找到文件)並拒絕繼續。我已經通過添加額外的線路運行腳本階段

cp -R build/Debug/MyFramework.framework ~/Library/Frameworks 

解決了這個問題,但它的感覺就像Sello的,錄音的東西,不應該首先被打破。我怎樣才能解決這個問題?

回答

11

在過去的幾個月中,我學到了更多關於框架的知識,所以我正在重寫這個答案。請注意,我在談論安裝框架作爲開發工作流程的一部分。

安裝公共框架(即一個將被多個應用程序或捆綁包使用的框架)的首選位置是/ Library/Frameworks [鏈接文本],因爲「該位置中的框架是由編譯時編譯器和運行時動態鏈接器。「[框架編程指南]。最好的方法是在「生成」設置的「部署」部分。

當你在你的框架上工作時,你有時候想要在構建時更新框架,當你不需要時更新框架。因此,我只在發佈配置中更改部署設置。所以:

  1. 雙擊框架目標彈出目標信息窗口並切換到生成選項卡。
  2. 在配置選擇框中選擇發佈。
  3. 向下滾動到部署部分,並輸入以下值:

部署位置= YES(點擊複選框)

安裝構建產品位置=/

安裝目錄=/Library/Frameworks

安裝構建產品位置作爲安裝的根。它的默認值是一些/ tmp目錄:如果你沒有改變它到系統根目錄,你將永遠不會看到你安裝的框架,因爲它隱藏在/ tmp中。

現在,您可以在Debug配置中隨心所欲地處理框架,而不會影響其他項目,並且當您準備好發佈所有需要做的事情時,請切換到Release並執行Build。

Xcode 4 Warning 自從切換到Xcode 4以來,我遇到了一些與我的自定義框架有關的問題。大多數情況下,他們在GDB中鏈接警告,除非運行內置的單元測試,否則這些警告不會干擾框架的實用性。我在一週前向蘋果公司提交了技術支持憑單,他們仍在研究它。當我得到一個工作解決方案時,我會更新這個答案,因爲這個問題已被證明非常受歡迎(1 kViews和計數)。

+0

你應該考慮cdespinosa關於Xcode構建系統的權威性答案。 – NSResponder 2009-11-07 11:14:53

+1

好吧,我投了他的答案,所以我希望我的膝蓋安全。但我確實認爲我得到的解決方案更加優雅,因爲它對默認Xcode設置的更改較少,並且不需要命令行。 – 2009-11-13 09:06:19

0

當然,當你發佈你的框架時,它應該安裝在/ Library/Frameworks中;然而,對於我來說,你正在使用框架的測試/調試版本來做這件事似乎很奇怪。

我的第一個直覺是在〜/ Library下安裝測試版本,因爲它只是讓你的測試和調試環境更簡單。如果可能的話,我希望調試/測試框架位於我正在測試的版本的構建樹中,在這種情況下,它作爲Private Framework安裝用於測試目的。這將讓你的生活變得更簡單,因爲它需要處理多個版本的框架。

最終,只要應用程序或測試套件加載正確版本,框架位於何處並不重要。選擇使測試/調試/開發最簡單的位置。

+0

由於該框架已被多個項目使用,因此將其作爲私有框架進行安裝並不可行。我已經嘗試了與發行版本(cp -R build/Release/MyFramework.framework/Library/Frameworks)相同的結果,但結果是一樣的。 至於它不在乎框架位於哪裏,只要... - 嗯,單詞讓我失望。 – 2009-11-04 20:38:17

3

沒有太多理由將框架放入庫/框架中,並且它有很多工作:您需要在安裝程序包中爲用戶執行此操作,這對創建和維護來說是一項巨大的麻煩,或者在您的應用程序中安裝代碼(只能安裝到〜/ L/F,除非您花費時間和精力使您的應用程序能夠以root權限安裝到/ L/F)。

更常見的是what Apple calls a 「private framework」。你會把它捆綁到你的應用程序包中。

即使是任何應用程序(例如Sparkle,Growl)通常使用的框架,實際上都被構建爲用作私有框架,僅僅是因爲將框架的單個副本安裝到庫的「正確」方式/框架是如此的麻煩。

+0

我不懷疑創建一個安裝程序包是很多工作 - 我從來沒有做過,也不是我期待的。但是由於無論如何都需要爲這些應用程序完成,我看不出爲框架增加一個將會是一件大事 - 它可能應該被捆綁到應用程序安裝程序中,除非它被證明是一個不尋常的流行框架。總而言之,我不相信讓框架保密是非常重要的。 – 2010-01-08 16:15:33

+0

我不同意。將.framework包複製到/ Library/Frameworks然後將其導入到其他Xcode項目中非常簡單。 – 2011-12-17 00:37:36

+0

@RaffiKhatchadourian:但那麼你的應用程序將不適用於其他人。您必須在每個用戶的機器上以L/F安裝框架;該應用程序不會爲任何沒有框架的用戶在您擁有的相同位置啓動。 – 2011-12-18 22:26:58

3

執行此操作的常規方法是讓您的框架項目及其客戶端共享一個公共構建目錄。 Xcode將搜索框架標題並鏈接到構建文件夾中的框架二進制文件第一個,位於任何其他位置之前。因此,一個編譯和鏈接頭部的應用程序項目將選擇最近建立的應用程序項目,而不是安裝任何東西。

然後,您可以刪除cp -r,而是使用Install Location構建設置將構建產品放置在最終位置,在命令行中使用xcodebuild install DSTROOT = /。但是,只有在完成時才需要這樣做,而不是在每次重建框架時都這樣做。

+0

有趣,但我發現這種方法有兩個問題。首先,xcodebuild安裝DSTROOT = /確實解決了「無法讀取符號」的問題。但是: 1)當框架的構建目錄指向公共構建目錄(項目文件夾外部)時,xcodebuild以某種方式忽略了框架中所做的更改。框架頭文件的修改日期會改變,但不會改變內容(可能與版本控制有關?)。 2)當我將構建目錄更改回默認構建時,xcodebuild會在框架內安裝另一個框架副本。奇怪的。 – 2009-11-06 20:53:20

相關問題