4

我一直在使用CodeRunner来收集在开发过程中经常使用但不一定属于项目代码库的小块代码。这是一个在 Objective-C 和 Cocoa 中总结的好工具,因为我可以包含安装在我机器上的框架。

但是,有时我想包含来自非框架的外部源的功能,例如 ASIHTTPRequest。如果我将 ASIHTTPRequest 文件放在附近的文件夹中#include,我会收到错误"Undefined symbols for architecture x86_64: _OBJC_CLASS_$_ASIHTTPRequest",我假设这意味着 ASI 文件根本没有被编译并与 CodeRunner 文档链接——这是一个正在编译的文件,而不是项目。在 Xcode 中,我会将 ASIHTTPRequest 文件添加到项目中,它们会自动编译并与其余代码链接,当我不使用 Xcode 时,什么是等效的?

我可以包含自定义参数和编译标志(后者-std=c99 -framework Foundation默认包含),我怀疑我必须以某种方式调整它们,但我无法找出如何。

4

1 回答 1

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

(我想,“Mac-flsjygxmngizhzfwnfgcakejmwkx”位对你来说会有所不同。)在那个目录中,有一堆 .o 文件和一个 'Mac.LinkFileList' 文件。该文件是您为 gcc 的 -filelist 参数提供的文件。您需要删除对 main.o、AppDelegate.o 和 ASIWebPageRequest.o 文件的引用,以免在链接步骤中出现重复的符号错误。

除了 ASIHTTPRequest 标头和 .o 文件之外,gcc 还期望与 SystemConfiguration、CoreServices 框架和 zlib 库链接,因为 ASIHTTPRequest 具有这些依赖项。

如果您正在使用此库进行大量测试,我建议将“Objective-C”语言定义(在 Preferences 下)复制为“Objective-C with ASIHTTPRequest”或其他内容。然后,您可以自定义编译标志以针对 ASIHTTPRequest 运行,而无需为您运行的所有 Objective-C 代码执行此操作。

您可能还希望将 .o 文件和“LinkFileList”文件复制到更永久的位置,以防万一 Xcode 清理掉构建树之类的东西。

于 2012-01-25T22:30:28.737 回答