«Не удалось создать модуль Objective-C» для статической библиотеки C в iOS Framework, когда модуль не кэширован

У меня есть структура Swift, которая включает статическую библиотеку C. Эта структура используется в приложении для iOS. Если я выполняю carthage archive свою структуру, а затем выводю результат в свое приложение в отдельном проекте Xcode, а затем, когда он пытается скомпилировать приложение, он блокирует выполнение команды CompileSwift:

<module-includes>:1:9: note: in file included from <module-includes>:1:
#import "my_sdk.h"
    ^
/Users/myUser/my-swift-sdk/ext/my-c-sdk/include/c_sdk.h:10:10: note: in file included from /Users/myUser/my-swift-sdk/ext/my-c-sdk/include/c_sdk.h:10:
#include "alpha/alpha.h"
     ^
/Users/myUser/my-swift-sdk/ext/my-c-sdk/include/alpha/alpha.h:12:10: note: in file included from /Users/myUser/my-swift-sdk/ext/my-c-sdk/include/alpha/alpha.h:12:
 #include "../bravo/bravo.h"
     ^
/Users/myUser/my-swift-sdk/ext/my-c-sdk/include/alpha/../bravo/bravo.h:13:10: error: 'omega.h' file not found
#include "omega.h"
     ^
<unknown>:0: error: could not build Objective-C module 'libMyCSdk'
0  swift                    0x000000010680664a PrintStackTraceSignalHandler(void*) + 42
1  swift                    0x0000000106805dfe SignalHandler(int) + 302
2  libsystem_platform.dylib 0x00007fff60ee7b3d _sigtramp + 29
3  libsystem_platform.dylib 0x0000000100020812 _sigtramp + 2668858610
4  swift                    0x0000000103f7a197 swift::GenericSignatureBuilder::addRequirement(swift::Requirement const&, swift::GenericSignatureBuilder::FloatingRequirementSource, swift::ModuleDecl*) + 887
5  swift                    0x0000000104005922 substType(swift::Type, llvm::function_ref<swift::Type (swift::SubstitutableType*)>, llvm::function_ref<llvm::Optional<swift::ProtocolConformanceRef> (swift::CanType, swift::Type, swift::ProtocolType*)>, swift::SubstOptions) + 2882
6  swift                    0x0000000104011318 swift::TypeBase::getTypeOfMember(swift::ModuleDecl*, swift::ValueDecl const*, swift::Type) + 168
7  swift                    0x0000000103b01582 swift::CalleeCandidateInfo::CalleeCandidateInfo(swift::Type, llvm::ArrayRef<swift::constraints::OverloadChoice>, bool, swift::constraints::ConstraintSystem&, bool) + 1122
8  swift                    0x0000000103a90b2c (anonymous namespace)::FailureDiagnosis::visitApplyExpr(swift::ApplyExpr*) + 10828
9  swift                    0x0000000103a6e206 swift::constraints::ConstraintSystem::diagnoseFailureForExpr(swift::Expr*) + 70
10 swift                    0x0000000103aa15af swift::constraints::ConstraintSystem::salvage(llvm::SmallVectorImpl<swift::constraints::Solution>&, swift::Expr*) + 6207
11 swift                    0x0000000103ba644a swift::TypeChecker::solveForExpression(swift::Expr*&, swift::DeclContext*, swift::Type, swift::FreeTypeVariableBinding, swift::ExprTypeCheckListener*, swift::constraints::ConstraintSystem&, llvm::SmallVectorImpl<swift::constraints::Solution>&, swift::OptionSet<swift::TypeCheckExprFlags, unsigned int>) + 122
12 swift                    0x0000000103ba6b27 swift::TypeChecker::typeCheckExpression(swift::Expr*&, swift::DeclContext*, swift::TypeLoc, swift::ContextualTypePurpose, swift::OptionSet<swift::TypeCheckExprFlags, unsigned int>, swift::ExprTypeCheckListener*, swift::constraints::ConstraintSystem*) + 1207
13 swift                    0x0000000103a7ee5c (anonymous namespace)::FailureDiagnosis::typeCheckChildIndependently(swift::Expr*, swift::Type, swift::ContextualTypePurpose, swift::OptionSet<TCCFlags, unsigned int>, swift::ExprTypeCheckListener*, bool) + 1516
14 swift                    0x0000000103a76a40 swift::ASTVisitor<(anonymous namespace)::FailureDiagnosis, bool, void, void, void, void, void>::visit(swift::Expr*) + 25280
15 swift                    0x0000000103a6e206 swift::constraints::ConstraintSystem::diagnoseFailureForExpr(swift::Expr*) + 70
16 swift                    0x0000000103aa15af swift::constraints::ConstraintSystem::salvage(llvm::SmallVectorImpl<swift::constraints::Solution>&, swift::Expr*) + 6207
17 swift                    0x0000000103ba644a swift::TypeChecker::solveForExpression(swift::Expr*&, swift::DeclContext*, swift::Type, swift::FreeTypeVariableBinding, swift::ExprTypeCheckListener*, swift::constraints::ConstraintSystem&, llvm::SmallVectorImpl<swift::constraints::Solution>&, swift::OptionSet<swift::TypeCheckExprFlags, unsigned int>) + 122
18 swift                    0x0000000103ba6b27 swift::TypeChecker::typeCheckExpression(swift::Expr*&, swift::DeclContext*, swift::TypeLoc, swift::ContextualTypePurpose, swift::OptionSet<swift::TypeCheckExprFlags, unsigned int>, swift::ExprTypeCheckListener*, swift::constraints::ConstraintSystem*) + 1207
19 swift                    0x0000000103c3e9ac swift::ASTVisitor<(anonymous namespace)::StmtChecker, void, swift::Stmt*, void, void, void, void>::visit(swift::Stmt*) + 12044
20 swift                    0x0000000103c3abbe swift::TypeChecker::typeCheckAbstractFunctionBodyUntil(swift::AbstractFunctionDecl*, swift::SourceLoc) + 1294
21 swift                    0x0000000103c40468 swift::TypeChecker::typeCheckAbstractFunctionBody(swift::AbstractFunctionDecl*) + 888
22 swift                    0x0000000103c67013 swift::performTypeChecking(swift::SourceFile&, swift::TopLevelContext&, swift::OptionSet<swift::TypeCheckingFlags, unsigned int>, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int) + 2515
23 swift                    0x00000001038a1865 swift::CompilerInstance::performSema() + 4949
24 swift                    0x0000000102a8e59b performCompile(swift::CompilerInstance&, swift::CompilerInvocation&, llvm::ArrayRef<char const*>, int&, swift::FrontendObserver*, swift::UnifiedStatsReporter*) + 731
25 swift                    0x0000000102a8adc5 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 7717
26 swift                    0x0000000102a30a35 main + 1349
27 libdyld.dylib            0x00007fff60cfe085 start + 1
Stack dump:
0.      Program arguments: [The stuff sent to SwiftCompile - lots to redact so will add if required]
1.      While type-checking 'addDevice()' at /Users/myUser/my-app/Sources/Views/MyView1/MyView1ViewController.swift:54:13
2.      While type-checking statement at [/Users/myUser/my-app/Sources/Views/MyView1/MyView1ViewController.swift:54:30 - line:94:5]
[code and some more 'While type-checking expression']
error: Segmentation fault: 11

Мне пришлось отредактировать его / изменить пути, так как это не проект с открытым исходным кодом, но все важное должно быть там.

Этого не произойдет, если я скомпилирую фреймворк в Xcode, а затем скопирую полученный двоичный файл в каталог Carthage в приложении; приложение работает нормально. Фреймворки имеют разные размеры, но это ожидается, поскольку Carthage будет создавать толстый двоичный файл для сим-карты и устройства, тогда как один, сгенерированный Xcode, будет делать только то или другое.

Я пытался заставить Карфаген построить и заархивировать в конфигурации отладки; это тоже не работает (отладка будет включать в себя оптимизацию / удаление).

Изменить. Приложение iOS, использующее платформу, перестает работать только при сборке симулятора. Если собираю для устройства, ничего страшного.

Изменить: я пробовал предложение здесь о добавлении пункта назначения при использовании xcodebuild из командной строки, т.е. xcodebuild clean build -scheme App -configuration Debug -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 8' - не сработало.

Изменить: чтобы указать это явно, я тоже несколько раз обнулял DerivedData :)

Изменить: среда - Xcode 10.0, построена с помощью iOS 12 SDK на Mojave.

Изменить: заголовок изменен, чтобы отразить новое исследование. Карфаген - отвлекающий маневр. Проблема вот в чем:

  • Приложение строится, если кеш модуля внутри DerivedData содержит запись для статической библиотеки C (например, когда она была создана как часть построения Swift Framework.
  • Если DerivedData очищается между сборкой Swift Framework и сборкой приложения, возникает описанный выше сценарий ошибки.
  • Carthage демонстрировал второе поведение, потому что он строит с использованием отдельного каталога DerivedData со своим собственным кешем модулей, что означает, что при попытке создать приложение в кэше, который использует приложение (по умолчанию), нет модуля для библиотеки C.
  • Для большинства связанных фреймворков с модулями C или Objective-C при создании приложения они получают запись кеша в кеше модуля. Моя статическая библиотека C не работает при создании приложения с использованием связанной платформы. Он действительно получает запись при создании самого Framework. Скорее всего, он не получит его, потому что xcodebuild не может сделать все, что ему нужно сделать, чтобы кэшировать модуль, потому что он встречает «отсутствующий» заголовок выше.

Изменить: успехов! Если я укажу «Пути поиска заголовков» на подключаемые каталоги моей статической библиотеки C и переименую там файл module.modulemap, все будет компилироваться. Это не решение, но подтверждает, что проекту приложения нужны заголовки для создания кэшированной версии модуля.


person SteveOfTheStow    schedule 18.10.2018    source источник
comment
Сообщение внизу - это трассировка стека с момента сбоя компилятора Swift. Вы должны отправить отчет об ошибке на bugreport.apple.com.   -  person zneak    schedule 19.10.2018


Ответы (1)


Как организованы ваши заголовки в проекте C?

Если у них есть такой узор:

Lib/
    Umbrella.h
    A/
        A1.h
        A2.h
    B/
        B1.h
        B2.h

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

person bscothern    schedule 20.10.2018