但是,有时我想要包含来自非框架的外部源的功能,例如ASIHTTPRequest.如果我将ASIHTTPRequest文件放在附近的文件夹中并#include它们,我会收到有关“架构x86_64的未定义符号:_OBJC_CLASS _ $_ ASIHTTPRequest”的错误,我假设这意味着ASI文件根本没有被编译并与之链接CodeRunner doc – 这是一个正在编译的单个文件,而不是一个项目.在Xcode中,我会将ASIHTTPRequest文件添加到项目中,它们会自动编译并与其余代码链接,当我不使用Xcode时,它是什么?
我可以包含自定义参数和编译标志(后者默认包含-std = c99 -framework Foundation),我怀疑我必须以某种方式调整这些,但我无法弄清楚如何.
解决方法
-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”语言定义(在“首选项”下)复制为“使用ASIHTTPRequest的Objective-C”或其他内容.然后,您可以自定义编译标志,以便针对ASIHTTPRequest运行,而无需对运行的所有Objective-C代码执行此操作.