Устранение ошибок ссылок в рабочей области 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 для этого проекта, если это имеет значение (я не думаю, что это имеет значение)

Мой вопрос: что я забыл?

Что я сделал --

  1. Создать проект для моей платформы и статической библиотеки

    а) создать проект для фреймворка Cocoa-Touch - назовем его mySDK, который создает mySDK.framework

    б) Добавить цель для статической библиотеки Cocoa-touch - назовем ее SDK, которая создает libSDK.a

    в) при желании построить обе цели - они строят хорошо

    г) закрыть проект

  2. Создайте проект для моего приложения - myApp - затем закройте проект

  3. Создайте рабочее пространство - myWorkspace - и откройте рабочее пространство

  4. Перетащите оба файла проекта из #1 mySDK и #2 myApp в рабочую область

  5. Создайте фреймворк и статическую библиотеку (успешно создайте и создайте цели)

  6. Добавьте статическую библиотеку в 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 проблемы, которые нужно исправить в моем случае:

  1. Заголовки не имели должного extern "C" объявления для функций C в файле C++.

  2. Один файл.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)
Другие вопросы по тегам