Я разбиваю большое приложение iOS на несколько фреймворков и столкнулся со следующей проблемой:
Как правильно включить пользовательский проект инфраструктуры Cocoa Touch в проект приложения iOS, чтобы все правильно связывалось?
- Я создал структуру проекта со всем необходимым кодом внутри.
- Для проверки я создал образец рабочего пространства и добавил в него проект фреймворка.
- Затем я создал образец проекта приложения для iOS с несколькими строками кода, используя фреймворк, а также добавил проект в рабочую область.
Теперь я перехожу к связующей части.
Первая попытка:
Откройте настройки цели приложения в Xcode, выберите панель
Info
и добавьте платформу в разделLinked Frameworks and Libraries
.Чтобы все было хорошо, я также выбираю только что добавленный фреймворк в проекте приложения и меняю его
Location
сRelative to Group
наRelative to Build Products
. Под местоположением отображается как../Debug-iphonesimulator/MyFramework.framework
Текущая схема
<Simulator, Debug>
, я нажимаюRun
, и все работает как надо — приложение регистрирует, что использует фреймворк в порядке.Теперь я очищаю папку сборки и меняю схему на
<Simulator, Release>
.Затем я нажимаю
Run
, проекты начинают создаваться, а затем привязка приложения завершается ошибкой:
Undefined symbols for architecture x86_64: <a function from the framework> referenced from: <a file in the app>
.
Изучив папку сборки, я вижу, что фреймворк был собран правильно, находится в .../Build/Products/Release-iphonesimulator/...
и представляет собой толстый двоичный файл с i386 и x86_64 внутри.
Как правильно связать фреймворк, чтобы он работал в любой конфигурации (отладка, выпуск) и на симуляторе, и, конечно же, на устройствах?
Чтобы уточнить, я намерен разрабатывать как фреймворки, так и приложение одновременно, поэтому такое решение, как, например. CocoaPods делает это путем предварительной сборки толстых фреймворков, что кажется не очень практичным (если только я что-то не упустил из-за отсутствия достаточного опыта работы с CocoaPods).
Ниже приведен вывод ошибочной фазы Link
:
Ld /Users/me/Library/Developer/Xcode/DerivedData/MyWorkspace-ahzqvfgoxbedpudjdhtqudgqzwba/Build/Intermediates/MyApp.build/Release-iphonesimulator/MyApp.build/Objects-normal/x86_64/MyApp normal x86_64
cd /some/where/here/lives/the/workspace
export IPHONEOS_DEPLOYMENT_TARGET=9.3
export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++
-arch x86_64
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator9.3.sdk
-L/Users/me/Library/Developer/Xcode/DerivedData/MyWorkspace-ahzqvfgoxbedpudjdhtqudgqzwba/Build/Products/Release-iphonesimulator
-F/Users/me/Library/Developer/Xcode/DerivedData/MyWorkspace-ahzqvfgoxbedpudjdhtqudgqzwba/Build/Products/Release-iphonesimulator
-filelist /Users/me/Library/Developer/Xcode/DerivedData/MyWorkspace-ahzqvfgoxbedpudjdhtqudgqzwba/Build/Intermediates/MyApp.build/Release-iphonesimulator/MyApp.build/Objects-normal/x86_64/MyApp.LinkFileList
-Xlinker
-rpath
-Xlinker @executable_path/Frameworks
-mios-simulator-version-min=9.3
-Xlinker
-objc_abi_version
-Xlinker 2
-fobjc-arc
-fobjc-link-runtime
-stdlib=libc++
-framework MyFramework
-Xlinker
-dependency_info
-Xlinker /Users/me/Library/Developer/Xcode/DerivedData/MyWorkspace-ahzqvfgoxbedpudjdhtqudgqzwba/Build/Intermediates/MyApp.build/Release-iphonesimulator/MyApp.build/Objects-normal/x86_64/MyApp_dependency_info.dat
-o /Users/me/Library/Developer/Xcode/DerivedData/MyWorkspace-ahzqvfgoxbedpudjdhtqudgqzwba/Build/Intermediates/MyApp.build/Release-iphonesimulator/MyApp.build/Objects-normal/x86_64/MyApp
Undefined symbols for architecture x86_64:
"SomeFancyFuncFromTheFramework()", referenced from:
-[AppDelegate application:didFinishLaunchingWithOptions:] in AppDelegate.o
MyApp_dependency_info.dat
(из последних аргументов-Xlinker
) содержит ссылки как наMyFramework.framework/MyFramework.tbd
, так и наMyFramework.framework/MyFramework
, оба внутри.../Build/Products/Release-iphonesimulator/
, насколько я могу судить (и FWIW). - person Sea Coast of Tibet   schedule 22.07.2016xcodeproj
, чтобы все заработало правильно. Если нет другого решения, стоит попробовать. - person Sea Coast of Tibet   schedule 23.07.2016