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


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설정 YES한 NOT 때문에 구현 파일로 이동하여, 나를 위해 일을, 그것은 불평을 중단했다. 이것은 실제로 헤더 파일을 가져오고 포함하는 기본 방법입니다. 이 작업을 완료하면 다시 설정하면 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.