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

У меня есть фреймворк 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 будет создавать толстый двоичный файл для сима и устройства, тогда как один, сгенерированный Xcode, будет делать только один или другой.

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

Редактировать : Приложение 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 не делает этого при создании приложения с использованием связанной платформы. Она получает запись при построении самой платформы. Вероятно, она не получает ее, потому что xcodebuild не может сделать что-либонужно сделать, чтобы кэшировать модуль, потому что он встречаетвышеприведенный «отсутствующий» заголовок.

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

1 Ответ

0 голосов
/ 20 октября 2018

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

Если у них есть такой шаблон:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...