Как собрать универсальную статическую библиотеку ios - PullRequest
8 голосов
/ 24 октября 2010

Я пытаюсь создать статическую библиотеку, которую можно использовать как с ios3.x, так и с ios4.x.Я могу создать статическую библиотеку с ios3.0, которая работает с другим проектом в ios3.0, но не будет компилироваться в ios4.То же самое относится и к ios4 к ios3.

Вот как воссоздать:

  1. Откройте XCode 3.2.4 и запустите новый проект, представляющий собой статическую библиотеку Cocoa Touch под названием Library4
  2. Нажмите на папку классов исоздайте новый UIViewController с именем «TestViewController»
  3. Щелкните правой кнопкой мыши папку Frameworks, добавьте существующий каркас, выберите UIKit
  4. На левой панели разверните цели, щелкните правой кнопкой мыши цель моей библиотеки и нажмите кнопку getИнформация.Измените все конфигурации, измените базовый sdk на iphone simulator 4.0, измените цель развертывания ios на ios3.0
  5. Нажмите на папку Link Library with Binaries.На правой панели измените роли обоих на «Слабые»
  6. Постройте библиотеку
  7. Откройте Xcode 3.2.2 и запустите новое приложение на основе View с именем Library4Test
  8. КопироватьTestViewController.h в папку классов
  9. Скопируйте файл libLibrary4.a в папку frameworks.Он автоматически добавляется в фазу компоновщика целевого объекта
  10. Щелкните правой кнопкой мыши объект Library4Test Target и выберите «получить информацию».В других флагах компоновщика добавьте «-ObjC» и «-all_load»
  11. В заголовок делегата приложения добавьте Import «TestViewController.h»
  12. В метод didFinishLaunchingWithOptions заголовка делегата приложения приложенияadd

    TestViewController * test = [TestViewController alloc] init;

  13. Компилировать с помощью симулятора ios3.0

При компиляции я получаю:

Ld build/Debug-iphonesimulator/library4Test.app/library4Test normal i386
cd /Users/test/Documents/Testing/library4Test
setenv MACOSX_DEPLOYMENT_TARGET 10.5
setenv PATH "/Developer/GrandpaIPhone/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Developer/GrandpaIPhone/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
/Developer/GrandpaIPhone/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 -arch i386 -isysroot /Developer/GrandpaIPhone/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk -L/Users/test/Documents/Testing/library4Test/build/Debug-iphonesimulator -L/Users/test/Documents/Testing/library4Test -F/Users/test/Documents/Testing/library4Test/build/Debug-iphonesimulator -filelist /Users/test/Documents/Testing/library4Test/build/library4Test.build/Debug-iphonesimulator/library4Test.build/Objects-normal/i386/library4Test.LinkFileList -mmacosx-version-min=10.5 -framework Foundation -framework UIKit -framework CoreGraphics -llibrary4_1 -o /Users/test/Documents/Testing/library4Test/build/Debug-iphonesimulator/library4Test.app/library4Test

Undefined symbols:
"_objc_msgSendSuper2", referenced from:
-TestViewController didReceiveMemoryWarning in liblibrary4_1.a(TestViewController.o)
-TestViewController viewDidUnload in liblibrary4_1.a(TestViewController.o)
-TestViewController dealloc in liblibrary4_1.a(TestViewController.o)
"__objc_empty_vtable", referenced from:
_OBJC_METACLASS_$_TestViewController in liblibrary4_1.a(TestViewController.o)
_OBJC_CLASS_$_TestViewController in liblibrary4_1.a(TestViewController.o)
"_OBJC_CLASS_$_UIViewController", referenced from:
_OBJC_CLASS_$_TestViewController in liblibrary4_1.a(TestViewController.o)
"_OBJC_METACLASS_$_UIViewController", referenced from:
_OBJC_METACLASS_$_TestViewController in liblibrary4_1.a(TestViewController.o)
".objc_class_name_TestViewController", referenced from:
literal-pointer@__OBJC@__cls_refs@TestViewController in library4_1os3TestAppDelegate.o
"_OBJC_METACLASS_$_NSObject", referenced from:
_OBJC_METACLASS_$_TestViewController in liblibrary4_1.a(TestViewController.o)
ld: symbol(s) not found
collect2: ld returned 1 exit status

Ответы [ 3 ]

2 голосов
/ 29 ноября 2010

Не совсем точно, но это похоже на проблему со связыванием (все эти вещи .o).Вот как я настроил свою статическую библиотеку iOS.Это очень простая вещь, но она работает.

  1. Запустите новый проект и выберите iOS Libarary >> Статическая библиотека Cocoa Touch
  2. Добавьте несколько классов.Мои - это категории в UIView, которые дают лучшие описания для использования в NSLog.
  3. Выберите цель и убедитесь, что для Роли каждого класса установлено соответствующее значение.В случае моих категорий это должно быть «публично».
  4. Дважды щелкните целевой объект и выберите вкладку «Сборка».
  5. Выберите выпуск конфигурации и задайте следующие параметры сборки:
  6. Местоположение развертывания ДА (проверка)
    Развертывание Постобработка ДА (отметьте)
    Установка Сборка продуктов Местоположение /

Сборка статической библиотеки.По умолчанию он будет встроен в / usr / local / lib

. Теперь создайте символическую ссылку для быстрого доступа к вашей новой библиотеке.Самый простой способ - открыть свой терминал и запустить следующие команды:

cd ~    
ln -s /usr/local/lib

Теперь откройте проект Xcode, в котором вы хотите использовать свою библиотеку.Создайте группу под названием «Библиотеки» или что-то в этом роде, нажмите Ctrl и нажмите «Добавить существующие файлы», чтобы добавить библиотеку.Это будет называться что-то вроде libYourLibrary.a Когда вы запустите ваш проект, вы получите ошибку компоновки.Поэтому дважды щелкните файл project , перейдите в «Сборка»> «Все конфигурации» и добавьте следующее значение в настройку «Пути поиска в библиотеке»: ~ / lib

0 голосов
/ 15 июня 2011

Ошибки компилятора происходят из-за того, что вы не ссылались на правильные системные фреймворки. Все символы темно-красного цвета взяты из Foundation.framework, UIKit.framework и libobjc.dylib.

Статические библиотеки не получают автоматически необходимые рамки, с которыми им нужно скомпоноваться, поэтому при их использовании вы должны сами добавить их в проект.

0 голосов
/ 29 ноября 2010

Как вы можете просто создать одну цель с помощью SDK? Я создаю статическую библиотеку для iOS-OSx, и процедура была намного проще.

  1. создание проекта (из шаблона iOS «Статическая библиотека Cocoa touch»)
  2. добавить исходные файлы
  3. добавить одну цель для sdk

Конечно, я должен добавить

#if TARGET_OS_IPHONE
...
#else
...
#endif

к коду. Вы можете добавить свои собственные условия.

...