프레임 워크 모듈 내에 비 모듈 식 헤더 포함


143

Xcode 6을 사용하고 있습니다.

1) 먼저 동적 라이브러리 (CoreLibrary)를 만들고 있습니다. 이 라이브러리에는 RequestPoster.h 파일이 포함되어 있습니다.

2) 그런 다음 Cocoa Touch Framework를 만들고이 동적 라이브러리 (CoreLibrary)를 추가했습니다.

3) 그런 다음이 프레임 워크가 프로젝트에 추가되고 RequestPoster.h 파일 (CoreLibrary)에 오류가 발생합니다.

오류 : 프레임 워크 모듈 클래스 내에 비 모듈 식 헤더 포함 :

ifaddrs.h, arpa / inet.h, sys / types.h>

프로젝트에서이 파일을 찾을 수 없습니다.

답변:


190

"대상"에서 빌드 설정으로 이동하여 "프레임 워크 모듈에 비 모듈 식 포함 허용"을 예로 설정하십시오.

실제 답변은 라이브러리 소유자가 가져 오기 위치를 변경해야한다는 것입니다. ifaddrs.h, arpa / inet.h, sys / types.h 파일은 Xcode가 싫어하는 프레임 워크의 .h 파일로 가져옵니다. 라이브러리 관리자는 .m 파일로 이동해야합니다. AFNetworking이 동일한 문제를 해결 한 GitHub에서이 문제를 예로 들어보십시오 : https://github.com/AFNetworking/AFNetworking/issues/2205


2
오류가있는 헤더가 가져온 헤더의 유형을 사용하는 경우 권장되는 것은 무엇입니까? 예를 들어, module의 header module.h가 type 매개 변수를 사용하는 함수를 선언하면 ifaddrsifaddrs.h를 가져 오기 위해 바인딩됩니다.
Ayush Goel

그러나 그들이 시스템에 포함된다면 /usr/include/libproc.h어떻게 될까요?
Ben Leggiero

3
변경의 영향을 설명해 주시겠습니까? 프레임 워크 모듈에 비 모듈 식 포함 허용
nr5

아마도 가장 좋은 대답은 기본적 으로이 오류를 침묵시키는 대신 모듈 식 헤더로 만드는 것입니다. 모듈에서 비 모듈 식 헤더를 허용하는 옵션을 제거하는 Apple을 쉽게 상상할 수 있습니다.
Ben Leggiero

170

헤더 파일이 프레임 워크의 공개 헤더의 일부로 공개적으로 사용 가능한지 확인하십시오.

프레임 워크-> 대상-> 빌드 단계로 이동하고 끌어서 관련 헤더 파일을 프로젝트에서 공용으로 이동하십시오. 희망이 도움이됩니다!

스크린 샷


3
덕분에 Objective C 코드를 Swift 프레임 워크에 포함시킬 수있었습니다. 감사합니다!
Vadim

1
XCode 메인 화면의 오른쪽에있는 파일 검사기 창을 사용하여 파일에서 프로젝트에서 공개로 대상 멤버십을 변경할 수도 있습니다.
Pigpocket

라이브러리를 swift / objc의 혼합으로 가져 오는 경우 브리징 헤더가 공개되어 있는지 확인해야합니다. 내가 만든 실수!
Nick H247

74

영향을받는 대상에 대한 빌드 설정의 프레임 워크 모듈 에서 비 모듈 식 포함 허용 을 YES로 설정할 수 있습니다 . 이것은 편집해야 할 빌드 설정입니다.

편집해야 할 빌드 설정 항목

참고 :이 기능을 사용하여 기본 오류를 발견해야합니다.이 오류는 종속 관계가있는 파일의 괄호로 묶인 전역 포함의 복제로 인해 자주 발생합니다.

#import <Foo/Bar.h> // referred to in two or more dependent files

설정이 경우 비 모듈 식 프레임 모듈에 포함 허용찬성 세트에서 결과 오류 또는 종류의 뭔가 "X가 모호한 참조입니다", 당신은 잘못된 중복 (들)을 추적하고이를 제거 할 수 있어야한다. 코드를 정리 한 후 프레임 모듈에서 비 모듈 식 포함 허용을 다시 NO로 설정하십시오 .


1
좋아, 문제를 일으키는 것은 꺾쇠 괄호였습니다! CocoaPods 가져 오기 에서이 문제가 있었고 꺾쇠 괄호 대신 따옴표를 사용하도록 가져 오기를 변경하여 수정했습니다.
Michael Forrest

죄송합니다. 내가 프로젝트를 청소 한 후에 깨 졌다는 것을 발견했다 :-/
Michael Forrest

2
'모호한 참조'경고를 찾을 수 없습니다. 그것을 YES로 설정하면 어떤 단점이 있습니까?
Nicolas Miari

28

헤더 파일을 공개하여 동일한 문제가 발생했습니다. [문제]

프로젝트에서 여러 모듈로 작업하는 경우 그런 다음 프로젝트의 다른 부분에서 사용하려면 헤더 파일을 공개해야합니다. 필요한 것은 해당 헤더 파일을 선택하고 프로젝트 유틸리티보기에서하는 것입니다. 파일을 Project / Private에서 Public으로 변경하십시오. 아래 이미지를보십시오 :

헤더 파일 범위 변경


기존 공개 헤더를 복제 할 때 특히이 문제가 발생합니다. 복제 된 헤더 멤버쉽이 "프로젝트"로 변경되었습니다.
Jeremie

아니 그것은 복제에 대한 의무가 아닙니다. 예를 들어 프로젝트에서 일부 프로젝트를 라이브러리로 완전히 가져온 다음 개인 클래스를 수정하려는 경우와 같이 다른 경우로 인해 발생할 수 있습니다. 헤더 파일을 알고 작성했지만 액세스 권한이 모든 프로젝트에 공개 된 것은 아닙니다.
Saad

22

"프레임 워크 모듈 내에 비 모듈 식 헤더 포함"

이 오류가 발생하면 파일 관리자 "대상 구성원"에서 가져 오려는 파일을 단순히 "공용"으로 표시하는 것이 어떤 상황에서는 해결책이 될 수 있습니다. 기본값은 "프로젝트"이며이 방법으로 설정하면이 오류가 발생할 수 있습니다. 예를 들어 Google Analytic의 헤더를 프레임 워크로 가져 오려고 할 때도 마찬가지였습니다.


이 답변은 비슷한 문제에 많은 도움이되었습니다. 프레임 워크 헤더 파일을 대상에 추가 할 수 있다는 것을 몰랐습니다. 응용 프로그램 프로젝트에서 헤더는 절대 대상의 일부가 아닙니다.
bio

20

실제로이 문제를 해결하는 더 쉬운 방법은 #import명령문을 헤더 파일 .m에 대신 대신 파일 의 맨 위로 이동하는 것입니다 .h. 이 방법으로 모듈이 아닌 헤더 파일을 포함하고 있다고 불평하지 않습니다. 나는이 문제를 가지고 Allow non-module includes설정 YESNOT 때문에 구현 파일로 이동하여, 나를 위해 일을, 그것은 불평을 중단했다. 이것은 실제로 헤더 파일을 가져오고 포함하는 기본 방법입니다. 이 작업을 완료하면 다시 설정하면 NO작동합니다.

이상적으로로 Allow non-module includes설정 하려고 노력해야 합니다 NO. YES대부분의 경우 이것을 설정하면 문제가있는 것입니다. 이 설정은 "모듈에 속하지 않은 임의의 헤더 파일을 디스크로 가져 오기 허용"으로 변환됩니다. 이것은 실제로 사용되는 매우 적은 유스 케이스에 적용되므로이 설정은 항상 NO(예 : 기본값) 이어야합니다 .


10

자체 프레임 워크를 개발하는 경우 :

왜 이런 일이 일어나고 있습니까?

module.modulemap 에서 언급 한 공개 헤더 파일 중 하나 에 modulemap에서 언급 되지 않은 import 문 이 있으면 오류가 발생합니다. 모듈로 선언되지 않은 (module.modulemap에서) 일부 헤더를 가져 오려고하기 때문에 프레임 워크의 모듈성이 깨집니다.

어떻게 고칠 수 있습니까?

module.modulemap에 오류를 일으킨 헤더를 포함시키고 다시 빌드하십시오!

왜 비 모듈 식 허용을 YES로 설정하지 않습니까?

이 솔루션은 실제로 여기에 해결책이 아니기 때문에 프로젝트에 "이 프레임 워크는 모듈 식이어야했지만 그렇지 않습니다. 어떻게 든 사용하지 않아도됩니다." 이것은 라이브러리의 모듈성 문제를 해결하지 않습니다.

자세한 내용은이 블로그 게시물을 확인 하거나 clang docs를 참조하십시오 .


cocoa 프로젝트 프레임 워크를 사용하여 module.modulemap을 어떻게 설정 했습니까? 저는 라이브러리가 Swift 전용 프로젝트에서 작동 할 수 있도록 시도했지만 라이브러리의 한 종속성, module.modulemap이 작동하지 않으므로 cocoapod는 모듈 맵을 자동 생성하지만 작동하지 않는 것 같습니다. 비슷한 점이 있습니까?
Amadeu Cavalcante Filho

8

CocoaPods 대상에 필요한 경우 다음 행을 Podfile다음에 추가하십시오 .

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      target.build_settings(config.name)['CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES'] = 'YES'
    end
  end
end

7

Allow Non-modular Includes in Framework Modulesobjc 코드에서만 작동합니다. 신속하게 작동하지 않습니다.

연구 기간이 지나면 swift가 경고 매개 변수를 clang에 전달할 수 있으므로 신속한 가져 오기 오류 OTHER_SWIFT_FLAGS-Xcc -Wno-error=non-modular-include-in-framework-module방지 하도록 설정 되었습니다 .

같은 문제가있는 사람에게만


6

나는 똑같은 문제가 있었고 위의 아무것도 도움이되지 않았습니다. 그래서 내 대답이 누군가에게 도움이되기를 바랍니다. 제 경우에는 문제가 ALWAYS_SEARCH_USER_PATHS 설정에있었습니다. 그것이 NO 프로젝트로 설정되었을 때 빌드되고 작동했습니다. 그러나 포드 중 하나가 YES로 설정 해야하는 한 오류가 발생했습니다.

프레임 워크 모듈 내에 비 모듈 식 헤더 포함

몇 잔의 커피와 하루 종일 연구 한 결과 Xcode 7.1 Beta 2 릴리스 노트 의 알려진 문제에 따르면 :

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

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


6

동일한 문제가 crazy.finally하게되면 인터페이스 대신 'import xxx.h'를 넣어 문제를 해결할 수 있습니다. Cocoapods를 사용하여 프로젝트를 관리하는 경우 추가 할 수 있습니다.

s.user_target_xcconfig = { 'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES'=> 'YES'}

'xxx.podspec'파일에


6

동적 프레임 워크를 빌드 할 때 우산 헤더 에이 오류가 표시 되면 파일을 다음과 같이 가져 오십시오.

#import "MyFile.h"

하지#import <MyFramework/MyFile.h>.


2

나는이 문제를 만났고 원래 CocoaPods 문제라고 생각했지만 누군가 (아마 나) ${PODS_ROOT}헤더 검색 경로에서 설정하고 검색으로 설정 한 앱 빌드 설정의 문제였습니다 recursive. 이를 통해 앱을 빌드 할 때 사용되지 않은 헤더를 찾을 수있었습니다. 일단 이것을 사용하도록 설정하면 non-recursive모든 것이 잘되었습니다. recursive검색을 사용 하는 것은 적절한 헤더를 찾으려고 끔찍한 해킹입니다. 교훈을 얻었습니다.


나는 이것이 내 문제라는 것을 확인할 수 있습니다.
Wilson Muñoz

PersonalizedAdConsent에서이 문제가 발생하여 문제가 해결되었습니다. 감사!
Steven Elliott

1

이것은 나에게 성가신 문제였습니다. 개별 파일 헤더 파일에 "비 모듈 식"헤더를 포함해야했기 때문에 제안이 특정 사례에 도움이되지 않는 것 같습니다. 내가 사용한 해결 방법은 접두사 헤더 파일에 가져 오기 호출을 고수하는 것입니다.


0

위의 솔루션을 확인한 후 Umbrella Header를 Headers 목록의 맨 아래로 이동하여 Xcode 9.3에서 작동했습니다.


0

Modules프레임 워크에서 폴더를 제거하여 해결했습니다 .

  • 파인더를 사용하여 앱 프로젝트에있는 프레임 워크 위치를 탐색하십시오.

  • Test.framework폴더 내부 (위의 경우 CoreLibrary.framework) 및 Modules폴더 삭제로 이동하십시오 .

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


0

제 경우에는 .podspecs 파일의 "s.source_files"섹션에 .h 및 .m 파일을 추가하는 것을 잊었습니다.

이것을 추가하면 정상적으로 작동합니다.

여기에 이미지 설명을 입력하십시오


0

@import FrameworkName대신 시도하십시오#import "FrameworkName.h"


-5

Git clean을 사용하여 수십 가지 오류를 해결할 수있었습니다. 명령은 다음과 같습니다. git clean -dffx && git reset --hard

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.