2011-06-09 64 views
9

在Xcode 4中導入靜態庫頭是否有最佳做法?我的大部分項目都依賴於其他幾個項目,所以最近我開始使用工作區功能從一個地方構建所有需要的模塊(我發現這很方便)。在Xcode 4中使用靜態庫的頭管理

有趣的是,我們無法在iOS上使用自定義框架,因此必須將依賴關係構建爲靜態庫,並且我會遇到標題搜索路徑問題。雖然框架將它們的標題與它們保持在框架束中,但靜態庫沒有選項。我討厭爲我導入的每個庫單獨設置用戶頭搜索路徑。理想情況下,我想將依賴項目拖到工作區,將庫添加到主目標並構建,無需進一步設置。此工作流是否受支持?

回答

5

我現在最好的解決方案是將所有支持庫保存在一個公用文件夾中(說Support),將標頭搜索路徑設置爲Support/**。感覺笨拙,但工作。

+0

我一直在試圖找到一個優雅的解決方案,這幾天了。你的是我迄今發現的最好的。 – Bastek 2012-06-07 19:21:58

+1

@zoul你可以請擴展嗎?我見過的教程都沒有解釋過程。我所做的是1)創建一個靜態可可觸摸庫,2)將xcodeproj文件拖放到客戶端項目中的'Dependencies'組中,3)將它添加到Target Dependencies和Link Binary中,4)嘗試設置標題搜索路徑...並且沒有辦法使這個最後一步工作:( – entonio 2013-08-14 23:06:03

+0

@entonio,[這是一個很好的教程](http://blog.carbonfive.com/2011/04/04/using-開源靜態庫-Xcode-4 /#adding_the_static_librarys_headers),它還包括設置標題路徑,希望它在發佈兩年後仍然是最新的。 – zoul 2013-08-15 06:27:28

1

我想通過設置靜態庫文件頭可以複製到Headers文件夾(而不是默認的/usr/local/include)。此文件夾將出現在build-products文件夾中,我可以設置用戶標題搜索路徑$(BUILT_PRODUCTS_DIR)並遞歸。

如果所有庫都設置爲將其公共標題複製到此文件夾,我確實會得到所需的行爲 - 添加新的依賴關係時,我只是將項目拖到工作區,設置鏈接依賴關係,我很好去。

+1

不幸的是,這對目前的Xcode無法可靠地工作,因爲某些原因,歸檔版本失敗。我希望有更好的解決方案。 – zoul 2011-08-03 13:25:05

3

我的工作很複雜,但對我來說效果很好。

在靜態庫項目的設置中,在「打包」部分中,我將「包裝擴展」設置爲「框架」。然後我改變:

"Public Headers Folder Path" to "$(PRODUCT_NAME).$(WRAPPER_EXTENSION)/Headers" 

"Private Headers Folder Path" to $(PRODUCT_NAME).$(WRAPPER_EXTENSION)/PrivateHeaders 

最終結果在構建產品是一個名爲「MyLibraryName.framework」膽量文件夾,其中活脫脫...好..一個框架。有一件事我喜歡,這是我可以使用框架式包括在我的代碼:

#include <MyLibraryName/blah.h> 

的缺點是,(如發現在從「zoul」的答案)「歸檔」命令不能正常工作。它不起作用的原因是因爲Archive命令將最終構建產品和目標構建產品分離到單獨的目錄中。一個正常的「構建」不會這樣做。歸檔時,系統會嘗試在最終構建產品目錄中找到靜態庫標題,並且無法找到它們,因爲系統會將它們放入靜態庫的目標構建目錄中。

如果你考慮一下,Xcode認爲你的靜態庫的目標有一個「產品」。該產品是「libMyLibraryName.a」。但是,目標確實有兩個產品:一個是圖書館,另一個是圖書館的標題集。存檔命令的問題是該庫作爲構建產品複製,但標題不是。當您嘗試運行歸檔文件時,最終會出現「找不到頭文件」。

要解決這個問題,我所做的就是使用運行腳本構建階段。該腳本看起來像這樣(用Ruby編寫):

if ENV["TARGET_BUILD_DIR"] != ENV["BUILT_PRODUCTS_DIR"] then 
    $product_name = ENV['PRODUCT_NAME'] 
    $wrapper_extension = ENV['WRAPPER_EXTENSION'] 
    $target_build_dir = ENV['TARGET_BUILD_DIR'] 
    $built_products_dir = ENV['BUILT_PRODUCTS_DIR'] 

    $source_file = File.join($target_build_dir, $product_name + "." + $wrapper_extension) 
    $dest_file = File.join($built_products_dir, $product_name + "." + $wrapper_extension) 

    system "ln -s #{$source_file} #{$dest_file}" if File.exist?($source_file) 
end 

因此,如果目標build目錄和內置的產品目錄不匹配......創建符號鏈接到假冒的「框架」我已經創建在建成的產品目錄。

正如我所說,這是一個複雜的計劃,但它的工作原理和讓我使用我喜歡的框架式包括。如果Xcode允許iOS開發人員創建Frameworks(這也意味着iOS會讓開發人員創建動態庫,Apple不願意這麼做),或者Apple會創建一個框架變體,那麼整個混亂將會大大簡化......一個包它包含一個靜態庫和與之一起使用的頭文件(一個static_framework?),以便您擁有一個包含頭文件和靜態庫的構建產品。