Я совершенно не знаком с использованием библиотек С++, поэтому оцените, что это может быть немного специфично для моего случая (дайте мне знать, и я могу предоставить более подробную информацию).
У меня есть внешняя библиотека С++, которую я пытаюсь использовать с проектом iOS. Библиотека следует за настройкой, make, make build pattern для вывода файла .a библиотеки. Когда я пытаюсь добавить этот файл библиотеки в Xcode, я получаю следующую ошибку:
игнорирование файла /Users/Developer/iOS/TestProj/libpresage.a, файл был построенный для архива, который не связан с архитектурой (i386):
/Users/Developer/iOS/TestProj/libpresage.a
Основываясь на этом вопросе, я попытался превратить Build Active Architecture только в NO, и я получаю ту же ошибку. Это заставляет меня подозревать, что я собрал библиотеку для неправильной архитектуры.
Запуск lipo -info в файле .a дает:
входной файл libpresage.a не является жирным файлом Нежирный файл: libpresage.a
- архитектура: x86_64
Учитывая, что это не armv7s, armv7 или arm64, я снова пытаюсь скомпилировать библиотеку С++ со следующими параметрами:
1) Попробуйте
./configure CC="gcc -arch armv7s" \
CXX="g++ -arch armv7s" \
CPP="gcc -E" CXXCPP="g++ -E"
Ошибка при компиляции, я получаю:
ld: library not found for -lcrt1.3.1.o
clang: error: linker command failed with exit code 1 (use -v to see invocation)
2) Попробуйте
./configure CC="gcc -arch arm64" \
CXX="g++ -arch arm64" \
CPP="gcc -E" CXXCPP="g++ -E"
Ошибка при компиляции, я получаю:
ld: warning: ld: warning: игнорирование файла /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/lib/libSystem.dylib, отсутствует требуемая архитектура arm64 в файле /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/lib/libSystem.dylib(2 среза) игнорирование файла /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/lib/libstdc++.dylib, отсутствует требуемая архитектура arm64 в файле /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/lib/libstdc++.dylib(2 среза)
ld: динамические основные исполняемые файлы должны связываться с libSystem.dylib для архитектура arm64 clang: ошибка: команда компоновщика не удалась с кодом выхода 1 (используйте -v, чтобы увидеть вызов)
Есть ли что-то очевидное, что мне не хватает?
EDIT:
Спасибо за ответы, поэтому мне удалось получить библиотеку в Xcode в качестве настраиваемой цели сборки, указав команду make на библиотеки MakeFile. Это прекрасно.
Мои шаги отсюда:
- Добавьте зависимость от моего целевого объекта приложения Objective C iOS к пользовательской цели сборки.
- Ссылка на библиотеку и создание обертки Objective С++.
- Это кажется прекрасным, пока мне не нужно вызвать внешнюю библиотеку С++, тогда я получаю ошибку при компиляции:
Undefined символы для архитектуры armv7: "Presage:: Presage (PresageCallback *)", на который ссылаются: - [PresageBridge init] в PresageBridge.o "Presage:: ~ Presage()", на который ссылаются: - [PresageBridge init] в PresageBridge.o ld: символ не найден для архитектуры armv7 clang: ошибка: команда компоновщика не сработала с кодом выхода 1 (используйте -v для вызова вызова)
-
Моя объектная С++-оболочка (связывание внешнего содержимого библиотеки С++ presage.h):
#import "PresageBridge.h" #include "presage.h" @implementation PresageBridge - (instancetype)init { if(self = [super init]) { Presage hello(&callback); } return self; }
-
На основе вышеприведенного кода не похоже, что я пропускаю заголовок, и интересно то, что я также попытался создать экземпляр других классов во внешней библиотеке, и они, похоже, работают, что говорит о том, что Xcode по какой-то причине не может связать presage.h.