Как включить неструктурные библиотеки при написании документов CodeRunner?
Я использовал 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
по умолчанию), и я подозреваю, что мне нужно как-то их подправить, но я так и не смог выяснить как.
1 ответ
Я получил это на работу. Конечно, 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, который поставляется вместе с библиотекой. Это создаст файлы.o в одном из тех глубоко закопанных каталогов "DerivedData", которые Xcode любит создавать. Тот, который он сделал для меня:
~/Library/Developer/Xcode/DerivedData/Mac-flsjygxmngizhzfwnfgcakejmwkx/Build/Intermediates/Mac.build/Debug/Mac.build/Objects-normal/x86_64
(Мне кажется, бит "Mac-flsjygxmngizhzfwnfgcakejmwkx" будет отличаться для вас.) В этом каталоге есть куча файлов.o и файл Mac.LinkFileList. Этот файл вы бы дали параметру -filelist для gcc. Вам нужно будет удалить ссылки на файлы main.o, AppDelegate.o и ASIWebPageRequest.o, чтобы не получить повторяющихся ошибок символов во время шага ссылки.
В дополнение к заголовку ASIHTTPRequest и файлам.o, gcc будет ожидать связи с SystemConfiguration, платформами CoreServices и библиотекой zlib, поскольку ASIHTTPRequest имеет эти зависимости.
Если вы выполняете много тестов с этой библиотекой, я бы рекомендовал продублировать определение языка "Objective-C" (в разделе "Предпочтения") как "Objective-C с ASIHTTPRequest" или что-то в этом роде. Затем вы можете настроить флаги компиляции для запуска с ASIHTTPRequest без необходимости делать это для всего кода Objective-C, который вы запускаете.
Вы также можете скопировать файлы.o и файл "LinkFileList" в более постоянное место, на тот случай, если XCode очищает это дерево или что-то в этом роде.