prosource

Swift 컴파일러 오류: "프레임워크 모듈 내부의 비모듈형 헤더"

probook 2023. 4. 28. 21:08
반응형

Swift 컴파일러 오류: "프레임워크 모듈 내부의 비모듈형 헤더"

이제 ObjC 프레임워크를 Swift로 마이그레이션하려고 하는데 다음 오류가 발생했습니다.

include of non-modular header inside framework module 'SOGraphDB'

이 참조는 프로토콜을 정의하는 헤더 파일에 대한 것이며 일부 클래스에서 이 헤더 파일을 사용하여 이 프로토콜을 사용합니다.

모듈 기능과 관련된 것처럼 보이지만 현재로서는 해결 방법이 명확하지 않습니다. 해결 방법을 알고 계십니까?

업데이트:

이것은 Swift 컴파일러 오류입니다.

업데이트 2:

근본 원인을 해결하지 못하는 간단한 해결 방법은 다음 설정을 예로 설정하는 것입니다. CLANG_ALLOW_NON_MODUAL_포함_IN_FRAMEWORK_MODULS = 예

머리글이 공용입니까?

프로젝트 탐색기에서 머리글 파일을 선택합니다.그러면 xcode 오른쪽 섹션에서 대상 옆에 드롭다운이 있는 것을 볼 수 있습니다.그것을 "프로젝트"에서 "공개"로 변경합니다.이것은 저에게 효과가 있었습니다.

공개 표제

이것은 예상되는 컴파일러 동작이며 매우 타당한 이유가 있습니다.

저는 이 문제에 부딪히는 대부분의 사람들이 그들이 전환한 후에 발생한다고 생각합니다.Application TargetFramework Target그리고 C 및 목표 C 헤더를 프레임워크의 우산 헤더에 추가하기 시작합니다. 이 헤더는 다르게 동작하는 응용 프로그램의 브리징 헤더와 동일한 동작을 가집니다.우산 헤더는 실제로 혼합 swift, obj-c 프레임워크용으로 지정되었으며, 그 목적은 프레임워크가 오브젝티브-c에 있는 외부 세계에 API를 노출하는 것입니다.그 말은 우리가 거기에 두었던 헤더들이 공공의 범위에 있어야 한다는 것을 의미합니다.

프레임워크의 일부가 아닌 Objective-C/C 헤더를 프레임워크의 빠른 코드에 노출하는 장소로 사용해서는 안 됩니다.이 경우 이 헤더들은 우리 프레임워크 모듈의 일부로 외부 세계에 노출될 것이며, 이는 종종 모듈성을 깨기 때문에 우리가 하고 싶은 것이 아닙니다. (그리고 그것이 바로 프레임워크 모듈에 비모듈 포함 허용 기본값이 NO이유입니다.)

Objective-C/C 라이브러리를 프레임워크 swift 코드에 노출시키기 위해서는 해당 라이브러리에 대해 별도의 swift 모듈을 정의해야 합니다.그럼 표준 스위프트는import YourLegacyLibrary사용할 수 있습니다.

: 임베딩 몇가일인시나에오대리해설다명니:습임딩베겠.libxml2우리의 틀 안으로.

먼저 다음을 생성해야 합니다.module.modulemap다음과 같은 방식으로 표시되는 파일:

OSX 프레임워크의 경우:

module SwiftLibXML2 [system] {
  header "/usr/include/libxml2/libxml/xpath.h"
  export *
}

iOS 프레임워크의 경우:

module SwiftLibXML2 [system] {
  header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/libxml2/libxml/xpath.h"
  export *
}

이것은 swift 모듈 안에서 헤더와 참조하는 다른 헤더를 감싸서 swift가 이러한 C 인터페이스에 대한 빠른 바인딩을 생성할 수 있도록 하는 것뿐입니다.

그런 다음 xcode 프로젝트 디렉토리에 폴더를 만듭니다.SwiftLibXML2 이 module을 거기에 .

빌드 설정에서 추가$(SDKROOT)/usr/include/libxml2머리글 검색 경로로

빌드 설정에서 추가$(SRCROOT)/SwiftLibXML2경로 가져오기

프로젝트의 일반 탭에서 추가libxml2.tbd연결된 프레임워크라이브러리로 이동합니다.

이제 필요한 곳에 이 모듈을 가져오십시오.

import SwiftLibXML2

module.Darwin'module.map.map의 .modulemap을 하는 것이 ./usr/include/module.modulemap거기에 가려면 Xcode 명령줄 도구가 설치되어 있어야 합니다. OS X El Capitan에 Missing /usr/include를 참조하십시오.

여기이 변경할.Pods.xcodeproj 일이수로으업작일▁each▁after 뒤에 수동으로pod install.

이 스니펫을 포드 파일의 끝에 추가합니다.

post_install do |installer|
  installer.pods_project.build_configuration_list.build_configurations.each do |configuration|
    configuration.build_settings['CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES'] = 'YES'
  end
end

저의 해결책은 타겟-> 빌드 설정-> 프레임워크 모듈 내 비모듈 포함 허용을 YES로 전환하는 것이었습니다!

Swift에서:

아래에 설명된 대로 Xcode 프로젝트 및 대상의 빌드 설정을 수정합니다.

프레임워크 모듈에 비모듈형 포함 허용:아니요.

비트 코드 사용:네.

Google 지도 iOS SDK에서 사용할 수 있는 최신 버전을 사용합니다(CocoaPods를 사용하여 다운로드).

Google 지도(1.10.4)

문제가 있는 가져오기 설명:

//import GoogleMaps

문제가 있는 가져오기를 추가하여 브리징 헤더 파일을 만들거나 수정합니다.

[Your Xcode Project Name]-Bridging-Header.h

// Use this file to import your target's public headers 
// that you would like to expose to Swift.
#import <GoogleMaps/GoogleMaps.h>

Xcode 프로젝트를 정리하고 다시 빌드합니다.

저는 이것을 피할 수 있었던 것 같아요.프레임워크에서 sqlite3를 사용하는 모델 코드가 있습니다.저의 경우, 범인은 <sqlite3>였습니다..

문제는 내 모듈/모듈에 있었습니다.h 헤더, <sqlite3>를 가져온 공용 헤더를 가져왔습니다.해결책은 모든 sqlite3_xx 유형을 숨기고 어떤 public .h에도 보이지 않도록 하는 것이었습니다.sqlite3에 대한 모든 직접 참조는 비공개 또는 프로젝트 가시성으로 설정되었습니다.예를 들어, 저는 sqlite3_stmt 포인터가 매달려 있는 공개 싱글톤을 가지고 있었습니다.나는 그것들을 이제 그 공개 헤더의 전진 선언일 뿐인 별도의 클래스로 옮겼습니다.이제 만들 수 있습니다.

덧붙여서, CLANG_ALLOW_NON_MODUAL_은포함_IN_FRAMEWORK_MODULS 설정이 작동하지 않았습니다.프레임워크와 종속 프로젝트 모두에서 설정해 보았습니다.이 문제를 해결하기 위해서는 필요했지만, 이유는 잘 모르겠습니다.

하지 마

#import "MyOtherFramework.h"

#import <MyOtherFramework/MyOtherFramework.h>

이 대답은 구식입니다.

프레임워크를 가져올 때 루트 헤더와 종속성을 공유하는 모든 헤더 파일을 가져와야 합니다.이렇게 하면 항상 작동하는 가장 쉬운 방법은 프레임워크의 "헤더" 폴더에 있는 모든 헤더를 공용 헤더 경로로 가져오는 것입니다.

여기에 이미지 설명 입력

Swift 컴파일러는 이 정보를 사용하여 연결된 유형 정보와 함께 비각형 기호 맵을 생성합니다.

헤더 파일이 대상에 할당되었지만 프로젝트가 표시된 것으로만 표시되었습니다. 공용으로 변경하면 이 오류가 해결됩니다.

빌드 설정 전환 > 프레임워크 모듈에 비모듈 포함 허용에서 YES!로 동일한 문제를 해결했습니다.

이것이 오래된 질문이라는 것을 알지만, 저는 같은 문제를 가지고 있었고 위의 어떤 것도 저에게 도움이 되지 않았습니다.그래서 저는 제 대답이 누군가에게 도움이 되기를 바랍니다.저의 경우 문제는 ALVERSE_SEARCH_USER_PATHs 설정에 있었습니다.NO project build로 설정되었을 때 정상적으로 작동했습니다.그러나 포드 중 하나에서 YES로 설정해야 하는 경우 오류가 발생했습니다.

프레임워크 모듈 내부의 비모듈형 헤더 포함

커피를 몇 잔 마시고 하루 종일 조사한 결과 Xcode 7.1 베타 2 릴리스 노트에 따르면 다음과 같은 내용이 포함되어 있다는 것을 알게 되었습니다.

이전에 컴파일된 프레임워크에 대해 "프레임워크 모듈 내부의 비모듈형 헤더 포함" 오류가 발생할 경우, "항상 사용자 경로 검색" 빌드 설정이 "아니오"로 설정되어 있는지 확인하십시오.레거시 이유에 대해서만 기본값은 "예"입니다.(22784786)

XCode 7.3을 사용하고 있었는데, 이 버그는 아직 수정되지 않은 것 같습니다.

저는 그 문제에 대한 제 경험도 추가하고 싶습니다.

요약하자면:

  • @httpslight의 대답은 훌륭하고 그것은 대부분의 문제를 해결합니다.
  • 다른 해결책은 비선택적 헤더를 허용하는 것입니다(위의 일부 답변 참조).
  • 프레임워크의 헤더를 공개(표시할 헤더만)로 표시하고 이를 우산 헤더로 가져옵니다.

위 답변에 제가 추가한 두 가지 사항이 있습니다.

  • 프로젝트의 가져오기에서 프레임워크를 직접 가져오는 헤더를 주의 깊게 확인합니다(가능하면 전달 선언을 사용하는 대신). 헤더 파일을 다른 헤더 파일에 포함하는 것은 좋은 방법이 아닙니다. 때때로 문제가 발생합니다.제대로 수행하지 않으면 하나의 헤더가 여러 개 포함되어 링커 문제가 발생할 수 있기 때문입니다.
  • 업데이트: 라이브러리의 아키텍처와 연결할 대상의 아키텍처가 일치하는지 확인합니다.
  • 그리고 마지막으로, 위의 모든 것을 한 후에도, 저는 여전히 그 오류에 부딪혔습니다.더포럼에서) ( ) <framework/headerName.h> 오직 만. ㅠㅠㅠㅠㅠㅠㅠ"headerName.h"문제가 사라집니다.

저는 마지막으로 이 문제를 시도했고 지금까지 더 이상 이 문제를 겪지 않았지만, 이 솔루션은 일부 상위 답변을 적용한 경우에만 유효하다고 생각합니다(예: 모듈 접근 방식과 비모듈형 헤더 허용 등).

저는 프로젝트에 제 프레임워크를 포함할 때 바로 이 문제를 겪었습니다.sqlite3.h의 모든 가져오기를 public.hones가 아닌 .m 파일에 넣어 수정했습니다.저는 다른 라이브러리들이 Xcode와 유사한 문제를 플래그로 표시할 수 있다고 생각합니다.

Facebook 4.02 sdk와 FBSDK CoreKit에 특정 문제가 있었습니다.

나는 모든 단계를 수행했지만 여전히 비모듈러 헤더에 대한 오류가 있습니다. 나는 프레임워크에서 특정 헤더만 끌어다 놓고 빌드 단계-> 헤더 섹션을 작성했습니다.

그런 다음 맨 위에 있는 프로젝트 탐색기에 헤더의 복사본을 자동으로 작성합니다.

빌드 단계 -> 헤더에서 제거하고 새 파일을 삭제하여 정상적으로 작동했습니다.

리셋된 것처럼 말입니다.

제 경우(Xcode 9 베타 6 - Swift 4 - 코코팟 사용), Podfile.lockPods 디렉토리를 삭제하고 실행했을 때 이 문제가 해결되었습니다.pod install다시

저는 swift2에서 swift3로 프로젝트를 업데이트한 후 이 문제가 생겼습니다.XCode 8.3.2를 사용하여 코드를 업데이트하고 있었는데 "프레임워크 모듈 내부의 비모듈형 헤더" 오류를 제거할 수 없었습니다.다른 버전의 XCode(버전 9.0.1)에서 동일한 프로젝트를 열었을 때 오류가 나타나지 않았습니다.

저는 이 스레드 설정 대상 -> 빌드 설정 -> 프레임워크 모듈에 비모듈 포함 허용을 YES!로 전환하는 등 가능한 모든 솔루션을 시도했습니다.

하지만 아무 것도 효과가 없었습니다.

포드를 위한 정적 라이브러리가 필요했기 때문에 use_frameworks!라고 코멘트하여 포드를 설치했을 때 이 오류가 발생하기 시작했습니다.

사유 스위프트 컴파일러가 (Xcode 13에서) 개인 프레임워크 헤더 #import "TFLTensorFlowLite"를 가져오는 중에 이 오류를 발생시켰습니다.h"는 공개 .h 파일에서 아래 스크린샷과 같이 .m 파일로 가져왔더니 Swift 컴파일러에서 이 오류를 발생시키지 않았습니다(참고로 내 프레임워크는 목표 c와 swift 코드를 모두 가지고 있었습니다).

여기에 이미지 설명 입력

여기에 이미지 설명 입력

가장 일반적으로 이 오류는 선택한 답변으로 인해 발생하지만 새 프로젝트 폴더로 프레임워크 파일을 끌 때 실수로 이 오류가 한 번 나타납니다.프레임워크를 삭제하기 위해 클릭했는데 실수로 파일을 완전히 삭제하기보다는 프레임워크에 대한 '참조 제거'만 눌렸습니다.이때 Finder에서 프로젝트 폴더를 열면 'CoreLocation' 및 'AudioToolbox'와 같은 파일이 표시됩니다.프로젝트 폴더에서 이러한 파일을 삭제하고 프로젝트를 정리하면 문제가 해결되었습니다.

비모듈형 포함 항목을 가져올 수 있게 한 후 Objective-C Bridging 헤더를 사용하여 해당 모듈을 가져올 수 있습니다.

#import <YandexMobileMetrica/YandexMobileMetrica.h>

그것을 제거하면서 해결했습니다.Modules폴더를 선택합니다.

  • 파인더를 사용하여 앱 프로젝트에 있는 프레임워크 위치 찾아보기

  • 안으로 들어가세요Test.framework폴더(위의 경우)SOGraphDB.framework) & 삭제Modules폴더를 누릅니다.

  • 앱을 치료하고 다시 빌드하면 문제가 해결됩니다.

Parse 프레임워크를 가져오는 동안 문제가 발생했습니다.이 문제를 해결할 수 있는 유일한 방법은 마지막 커밋 이후의 모든 변경 사항을 폐기하고(단순히 프레임워크를 삭제하고 프로젝트를 정리하지 못함) 다른 필요한 프레임워크와 함께 Parse를 다시 추가하는 것이었습니다.

언급URL : https://stackoverflow.com/questions/24103169/swift-compiler-error-non-modular-header-inside-framework-module

반응형