2012-01-18 28 views
4

我一直在使用CodeRunner來收集在開發過程中經常使用的小塊代碼,但不一定屬於項目的代碼庫。這是一個在Objective-C和Cocoa中總結的好工具,因爲我可以包含安裝在我的機器上的框架。如何在編寫CodeRunner文檔時包含非框架庫?

但是,有時我想包含來自不是框架的外部來源的功能,例如ASIHTTPRequest。如果我將ASIHTTPRequest文件放置在附近的文件夾中,並且我遇到了有關"Undefined symbols for architecture x86_64: _OBJC_CLASS_$_ASIHTTPRequest"的錯誤,我認爲這意味着ASI文件不會被編譯並與CodeRunner文檔鏈接 - 這是一個正在編譯的單個文件,不是一個項目。在Xcode中,我會將ASIHTTPRequest文件添加到項目中,並自動將其編譯並與代碼的其餘部分進行鏈接,當我不使用Xcode時,相當於什麼?

我可以包括自定義參數和編譯標誌(後者默認包含-std=c99 -framework Foundation),我懷疑我不得不調整這些,但我一直無法找到如何。

+0

+1鏈接到CodeRunner,很酷的應用程序。 – 2012-01-24 02:39:01

回答

3

我得到它的工作。當然,gcc需要一些額外的參數來鏈接到ASIHTTP模塊。這是我結束了:

-std=c99 -framework SystemConfiguration -framework CoreServices -framework Foundation -lz -I/path/to/asi-header-files -filelist /path/to/list-of-asi-compiled-modules 

我想,你的代碼只是包括路徑的ASIHTTPRequest.h等頭文件...如果你使用有明確的路徑,你不需要-I在上面切換。 gcc確實需要有一個來自ASIHTTPRequest.m的編譯版本的代碼和朋友來鏈接它。一種方法是編譯庫中附帶的「Mac」項目。這將在Xcode喜歡製作的深埋「DerivedData」目錄之一中生成.o文件。它爲我做的一個是:

~/Library/Developer/Xcode/DerivedData/Mac-flsjygxmngizhzfwnfgcakejmwkx/Build/Intermediates/Mac.build/Debug/Mac.build/Objects-normal/x86_64 

(「陸委會-flsjygxmngizhzfwnfgcakejmwkx」位會爲你不同,我想。)在該目錄中,也有.o文件一堆和「Mac.LinkFileList '文件。這個文件是您爲gcc提供-filelist參數的文件。您需要刪除對main.o,AppDelegate.o和ASIWebPageRequest.o文件的引用,以免在鏈接步驟中出現重複的符號錯誤。

除了ASIHTTPRequest頭和.o文件,gcc將期望與SystemConfiguration,CoreServices框架和zlib庫鏈接,因爲ASIHTTPRequest具有這些依賴關係。

如果你正在用這個庫做很多測試,我會建議在Objective-C中用Objective-C和ASIHTTPRequest來複制「Objective-C」語言定義(在Preferences下)。然後,您可以自定義針對ASIHTTPRequest運行的編譯標誌,而不必爲所運行的所有Objective-C代碼執行該標誌。

您可能還想將.o文件和「LinkFileList」文件複製到更加固定的位置,以防萬一Xcode清理掉構建樹或其他東西。

+0

謝謝布拉德!你的參數有99%的方式,但我遇到了有關ASIWebPageRequest的main()和錯誤重複定義的錯誤。我編輯了LinkFileList中main.o,AppDelegate.o和ASIWebPageRequest.o的鏈接,現在一切正常。也許你建立了一個不同的ASIHTTPRequest mac項目? – Nick 2012-01-28 17:18:26

+0

啊,是的......我也必須這樣做。對不起,我忽視了這一步。 – 2012-01-28 21:25:33