Устранение ошибок ссылок в рабочей области ios со статической библиотекой
Я делал это раньше, несколько лет назад с Xcode 5 или 6. Теперь, используя Xcode 8 или 9, мне кажется, что-то не хватает. Независимо от того, что я сделал, когда я пытаюсь собрать и связать свой проект, я получаю сообщение Linker:
Undefined symbols for architecture arm64:
"_OBJC_CLASS_$_MyClass", referenced from:
objc-class-ref in ViewController.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Это не повторяющийся вопрос. Это не проблема архитектуры. Ни один из других результатов, которые я нашел на SO или Google, не решил эту проблему.
Я явно пропускаю некоторые настройки сборки, но не могу понять, какие из них. Между попытками сборки я очистил папку сборки и удалил DerivedData. Выйдите и перезапустите Xcode. Создал новый набор проектов с новым рабочим пространством и прошел шаги, описанные ниже.
Я пишу в Цель-C для этого проекта, если это имеет значение (я не думаю, что это имеет значение)
Мой вопрос: что я забыл?
Что я сделал --
Создать проект для моей платформы и статической библиотеки
а) создать проект для фреймворка Cocoa-Touch - назовем его mySDK, который создает mySDK.framework
б) Добавить цель для статической библиотеки Cocoa-touch - назовем ее SDK, которая создает libSDK.a
в) при желании построить обе цели - они строят хорошо
г) закрыть проект
Создайте проект для моего приложения - myApp - затем закройте проект
Создайте рабочее пространство - myWorkspace - и откройте рабочее пространство
Перетащите оба файла проекта из #1 mySDK и #2 myApp в рабочую область
Создайте фреймворк и статическую библиотеку (успешно создайте и создайте цели)
Добавьте статическую библиотеку в myApp
а) Выберите myApp и перейдите к этапам сборки
б) Открыть бинарную ссылку с библиотеками
c) Перетащите из библиотеки библиотечные продукты libSDK.a в область ссылок на двоичные файлы, установив значение "Требуется". Библиотека теперь отображается в групповой области Frameworks в myApp.
7) Выберите проект myApp и перейдите в build-settings
Add to Header Search Paths = "$(SRCROOT)/../mySDK/mySDK"
Это устраняет ошибки компиляции при поиске заголовков
Теперь я спрашиваю: зачем мне делать что-то еще, разве XCode не может понять все остальное?
Различные решения или учебники, которые я рассмотрел, предлагают добавить:
- Другие флаги связывания = -ObjC
- Пути поиска в библиотеке = $(BUILT_PRODUCTS_DIR)
- Пути поиска в библиотеке = "$(SRCROOT)/../mySDK"
- Изменение Пропустить Установка с ДА на НЕТ
- Расположение продукта сборки установки = $(BUILT_PRODUCTS_DIR)
Я пробовал все это в разных комбинациях.
Как только я добавил библиотеку в myApp, я вижу, что файл Frameworks/libSDK.a меняется с красного на черный, когда я собираю библиотеку, поэтому что-то в рабочей области / проекте знает, что я построил библиотеку, и видит ее.
Так почему, когда я пытаюсь собрать myApp, я все еще вижу ошибку лайнера:
Неопределенные символы для архитектуры arm64: "_OBJC_CLASS_$_MyClass", на которую ссылаются из: objc-class-ref в ViewController.o ld: символы не найдены для архитектуры arm64 clang: error: сбой команды компоновщика с кодом выхода 1 (используйте -v чтобы увидеть призыв)
Ничто из того, что я сделал, похоже, не устраняет эту ошибку Я дергаю себя за волосы, пытаясь найти решение.
Я также проверил, что он строит все соответствующие архитектуры, подтвердил это с помощью 'lipo -info'
Xcode, очевидно, знает о библиотеке, почему она не связана?
1 ответ
Хотя это не точный ответ на вопрос, задающий Objective-C, я предлагаю его в случае, если он помогает @reststop или помогает кому-то, испытывающему проблемы, и ищет ответы, как я. (Пожалуйста, не голосуйте против.)
Мое приложение также скомпилировано без проблем, но при соединении со статической библиотекой возникнет ошибка. Моя библиотека была основана на C++.
У меня было 2 проблемы, которые нужно исправить в моем случае:
Заголовки не имели должного
extern "C"
объявления для функций C в файле C++.Один файл.cpp не включает # соответствующий заголовок, поэтому
extern "C"
будет правильно применен к скомпилированной версии.
У компоновщика были проблемы, потому что компилятор использовал искаженное имя для функции из-за ошибок. Позже подтвердил это, посмотрев в.a файл с текстовым редактором. Я нашел свою функцию с префиксом "_Z11" и суффиксом "v".
Был еще один ключ: в сообщении об ошибке отсутствовало имя функции с подчеркиванием спереди.
Undefined symbols for architecture arm64:
"_myCFunction", referenced from:
SwiftModule.swiftFunction () -> () in MySwiftClass.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)