[objective-c] 프레임 워크 모듈 내에 비 모듈 식 헤더 포함

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

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

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

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

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

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

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



답변

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

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


답변

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

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

스크린 샷


답변

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

편집해야 할 빌드 설정 항목

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

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

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


답변

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

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

헤더 파일 범위 변경


답변

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

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


답변

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

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


답변

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

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

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

어떻게 고칠 수 있습니까?

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

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

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

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