Неопределенные символы при ссылке на PLCrashReporter 1.2 beta 2 в статической библиотеке и встроенном клиенте

Я создал статическую библиотеку и добавил агрегированную цель для создания статической платформы .framework, чтобы я мог выпустить ее для пользователей.

Мне нужно использовать PLCrashReporter для этой статической библиотеки, поэтому я загрузил последнюю версию 1.2 beta 2, поскольку добавлена ​​поддержка ARM64, и добавил файл .xcodeproj в группу внутри моей статической библиотеки. Добавлены пути поиска пользовательских заголовков в настройках сборки целевой статической библиотеки, на этапах сборки добавлены в целевые зависимости статическая библиотека CrashReporter-iOS-Device (CrashReporter) и Link Binary With Libraries добавлена ​​статическая библиотека libCrashReporter-iphoneos.a.

Моя статическая библиотека успешно строит все цели без проблем, но когда дело доходит до добавления моего проекта .xcodeproj в качестве зависимости в тестовый проект клиента пользовательского интерфейса или даже непосредственного добавления .framework, который я генерирую, сборка для симулятора ломается.

Я могу запустить его на устройстве и работать правильно, но важно использовать его и в симуляторе.

Если я нажму сборку, я получаю следующие ошибки.

Undefined symbols for architecture i386:
  "std::terminate()", referenced from:
      ___clang_call_terminate in libReporter-iOS.a(PLCrashSignalHandler.o)
      ___clang_call_terminate in libReporter-iOS.a(PLCrashAsyncImageList.o)
  "___cxa_begin_catch", referenced from:
      ___clang_call_terminate in libReporter-iOS.a(PLCrashSignalHandler.o)
      ___clang_call_terminate in libReporter-iOS.a(PLCrashAsyncImageList.o)
  "___gxx_personality_v0", referenced from:
      Dwarf Exception Unwind Info (__eh_frame) in libReporter-iOS.a(PLCrashSignalHandler.o)
      Dwarf Exception Unwind Info (__eh_frame) in libReporter-iOS.a(PLCrashAsyncImageList.o)
      Dwarf Exception Unwind Info (__eh_frame) in libReporter-iOS.a(PLCrashSignalHandler.o)
      Dwarf Exception Unwind Info (__eh_frame) in libReporter-iOS.a(PLCrashAsyncImageList.o)
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Я пропустил что-то точно здесь!

Заранее спасибо.


person George Taskos    schedule 12.12.2013    source источник


Ответы (2)


Похоже, что архитектура i386 отсутствует в libCrashReporter-iphoneos.a (имя этого файла также предполагает, что он предназначен только для устройства). Попробуйте запустить lipo -info libCrashReporter-iphoneos.a, чтобы увидеть, есть ли все необходимые архитектуры, если i386 (необходим для симулятора) нет, вам нужно найти библиотеку для i386 (или собрать ее, если вы собираете ее самостоятельно) и использовать lipo -create lib-iphoneos.a lib-iphonesimulator.a -output lib-all.a для создания библиотека со всеми необходимыми архитектурами.

P.S. Я только что загрузил последнюю сборку с сайта https://www.plcrashreporter.org, и похоже, что CrashReporter.framework в iOS Framework содержит armv7, armv7s и i386, поэтому вы можете попробовать это, если вам не нужны arm64 и x86_64.

EDIT: см. это для поддержки arm64 (это бета-версия с сентября).

EDIT2: сначала я не обратил внимания на std::terminate(), поэтому, если есть все необходимые архитектуры, вам, возможно, придется добавить libstdc++ в связанные платформы и библиотеки.

person Ivan Genchev    schedule 12.12.2013
comment
Спасибо, скачал с сайта 1.2 beta2. Добавил проект в мою статическую библиотеку, поэтому он будет содержаться в моей сборке выпуска. Если я создам толстую библиотеку с lipo и добавлю ее в свою статическую библиотеку, будет ли мой .framework содержать толстую библиотеку PLCrashReporter? Я вижу, что есть допустимые архитектуры. Я тоже пробовал симулятор lib. Та же ошибка. - person George Taskos; 12.12.2013
comment
Я не обратил внимания на std::terminate() в журнале. Так что проблема может быть в libstdc++, возможно, вам придется добавить -lstdc++ к флагам компоновщика. - person Ivan Genchev; 12.12.2013
comment
Большое Вам спасибо. Это действительно решило проблему, теперь выглядит хорошо! Не могли бы вы объяснить, чтобы я мог ясно понять это? Должен ли я добавить этот флаг компоновщика в свою библиотеку или мне нужно сообщить об этом пользователям? - person George Taskos; 12.12.2013
comment
Вам нужно сообщить об этом своим пользователям. PLCrashReporter использует std::terminate (cplusplus.com/reference/exception/terminate) для перехвата неперехваченных исключений С++, и он не связывается статически с libstdС++, поэтому приложения, которые связываются с PLCrashreporter, должны связываться с libstdС++. - person Ivan Genchev; 12.12.2013

Кстати.. может быть полезно другим..

те же настройки: -lstdc++ в флагах компоновщика может решить аналогичную головную боль при использовании MySQL в C/C++ в Xcode в OSX. на самом деле, когда вы ссылаетесь на libmysqlclient.a или libmysqlclient.dylib, вы получаете ту же ошибку.

Он был нарушен в отношении предыдущей установки mysql.

убедитесь, что у вас есть:

//: конфигурация = отладка OTHER_LDFLAGS = -lstdc++

//: конфигурация = дистрибутив OTHER_LDFLAGS = -lstdc++

//:completeSettings = некоторые OTHER_LDFLAGS

Надеюсь, это может помочь.

person ingconti    schedule 06.01.2015