Swift Framework : Umbrella 헤더 '[…] .h'를 찾을 수 없습니다.


114

Objective-CSwift 코드 를 모두 포함하는 사용자 정의 프레임 워크 에서 Swift 컴파일러는 다음 오류를 발생시킵니다.

[build_path]/unextended-module.modulemap:2:19: error: umbrella header 'bugtest.h' not found
  umbrella header "bugtest.h"
                  ^
<unknown>:0: error: could not build Objective-C module 'bugtest'

답변:


240

이것은 일반적으로 프로젝트 이름 변경 또는 이와 유사한 후에 발생합니다. 문제는 우산 헤더가 더 이상 공용 헤더 로 나열되지 않는다는 것 입니다. 이 문제를 해결하려면 첨부 된 이미지를 확인하십시오.

고치다


7
Pod 대상을 클릭해야하는 'Build Phases'의 'Headers'섹션을 확인하려면 미래 독자에게 참고하십시오. 메인 앱 타겟은 '헤더'섹션을 나열하지 않습니다.
shmim

3
이것은 완전히 고쳐졌습니다. 감사합니다. 이것은 승인 된 답변이어야합니다.
구자민

16
나를 위해-액세스 수준이 공개되었지만 우산을 찾을 수 없음에서도 실패합니다. "빌드 단계"의 "헤더"섹션을 맨 위로 이동했고 작동하기 시작했습니다.
Aleksei Minaev

6
내 우산 헤더는 이미 공개되었습니다. 섹션을 맨 위로 이동해도 도움이되지 않았습니다.
Rafael Bugajewski 2016

1
Carthage가 가져온 프레임 워크 중 하나를 업데이트 할 때 비슷한 문제가 발생했습니다. XCode가 참조 된 프레임 워크 경로 변경을 주시하는 데 문제가있는 것 같습니다. 간단한 XCode 다시 시작으로 문제가 해결되었습니다.
Tony

48

Xcode 7 베타에서는 Swift 2와 함께 프레임 워크 헤더가 "공개"로 선언되지 않은 경우에도 발생합니다.

예를 들어, 헤더 파일에 대한 "프로젝트"가시성을 가진 Cocoa Touch Framework가 있었고, "공개"헤더가 있으면 프로젝트의 모든 Swift 파일에 대해 "우산 헤더 ... 찾을 수 없음"오류가 발생했습니다. 오류가 사라졌습니다


1
제 경우에는이 문제가 발생했을 때이 답변이 "더 정확한"답변처럼 보였고 저에게 효과적이었습니다.
greymouser

1
동의합니다. 이것은 정답입니다. <project> .h 파일에 올바른 대상 멤버 자격 및 액세스 수준 (공용)이 있는지 확인합니다.
user965972

Shadow_x99 @ 어떻게 내 질문에 게시됩니다 "공개"로 헤더 설정 할 stackoverflow.com/questions/36084291/...
user2727195을

이것은 실제로 Xcode가 변경을 수행한다는 점을 제외하고는 @arturgrigor의 대답의 변형입니다. 최종 결과는 동일해야합니다.
original_username

40

Xcode 이전 버전의 버그를 무시하고 이런 일이 발생할 수있는 4 가지 방법이 있습니다.

  • 프로젝트에 $ (TARGET_NAME) .h라는 우산 헤더가 없습니다.
  • 우산 헤더가 있지만 공개로 설정되지 않았습니다. Arturgrigor의 답변보기
  • DEFINES_MODULE 로 설정되지 않음 YES
  • CLANG_ENABLE_MODULES 로 설정되지 않음 YES

3
그 자체가 모든 대상 (단지의 Info.plist 등)에서 확인할 수 안 umbrella_header.h : 난 그냥 발견하는 5 번째 원인
nalexn

3
이 목록에 모든 것이 올바르게 설정되어 있지만 실패합니다.
Erik Aigner

25

이것은 Always Search User Paths 프레임 워크 대상에 대한 설정이 활성화 된 .

로 설정하면 No해당 오류가 해결됩니다.

IMHO 이것은 Swift Compiler의 버그이며 Apple에 레이더를 제출했습니다. rdar를
참조하십시오 .


1
감사! 이게 저를 사로 잡은 것입니다.
Chris Hatton의

이것은 나를 위해 일했습니다. 추가 증상은 청소 직후 실패했지만 청소하지 않고 다시 시도하면 성공한 것입니다.
Ben Leggiero 2011

18

나를 위해-액세스 수준이 공개되었지만 우산을 찾을 수 없음에서도 실패합니다. "빌드 단계"의 "헤더"섹션을 맨 위로 이동했고 작동하기 시작했습니다. podfile에 대한 스크립트 :

post_install do |installer|
installer.pods_project.targets.each do |target|
    phase_name = 'Headers'
    target.build_phases.each do |phase|
        if (phase.display_name.include? phase_name)
            target.build_phases.unshift(phase).uniq! unless target.build_phases.first == phase
        end
    end
end

왜 그런 일이 일어나는지 전혀 모릅니다. 더미 프로젝트를 시도했지만 발생하지 않았습니다. 여러 종속성이있는 큰 경우에만. 우산 헤더를 복사하기 전에 컴파일하는 것이 있습니다.


4
"소스 컴파일"위로 "헤더"를 이동하는 것이 저에게 효과적이었습니다. xCode 8.2.1.
Rob Paterson

헤더 단계를 맨 위로 이동하는 것도 저에게 효과적이었습니다.
Søren Mortensen

잘못된 Podfile파일 : 구문 오류, 예기치 않은 입력 끝, keyword_end 예상.
Volodymyr Kulyk

13

프레임 워크를 공개로 설정해야합니다.

여기에 이미지 설명 입력


1
완벽하게 작동합니다. 감사합니다!
kkiermasz

그 스크린 샷의 맥락은 무엇입니까? 거기에 가기 위해 무엇을 클릭합니까?
pkamb

7

나를 위해 '헤더 맵 사용'을 '아니요'로 설정하면 문제가 해결되었습니다.


… 제 경우에는 YES로 설정하면 문제가 해결되었습니다. 불행히도이 설정에 대한 문서가없는 것 같지만 예는 기본값이며 내 대상 중 하나에 대해 왜 no로 설정되었는지 잘 모르겠습니다.
robotspacer

7

한 가지 더 해결책 : 폴더 이름을 변경 한 후에도 Xcode의 사이드 바를 통해 위치를 업데이트 한 경우에도 .h 파일의 프로젝트 파일에 이전 위치가 계속 표시 될 수 있습니다. 이 이전 위치로 인해 우산 헤더 오류가 발생합니다.

간단한 해결책 : .h 파일에 대한 참조를 제거하고 다시 추가하십시오. (그런 다음 다시 공개하는 것을 잊지 마십시오!)


5

New Swift Build System과 Parallelize Build가 구성표를 켜면이 질문과 같은 오류가 발생한다는 것을 알았습니다. 해결책은 신속한 소스 파일로 가져온 프레임 워크에 연결하는 것이 었습니다. (이전에 프레임 워크가 직렬 빌드 대기열에서 이전에 빌드 된 항목에 링크되어 있기 때문에 이전에 앱이 빌드 될 것이라고 생각합니다.)

작업 영역의 모든 대상에서 모든 가져 오기를 수행하고 해당 프레임 워크가 해당 대상에 연결되었는지 확인하는 스크립트를 작성했습니다.

https://github.com/Jon889/SwiftImportChecker


4

이미 여기에 훌륭한 답변이 있습니다. @ Shadow_x99는 매우 도움이되었습니다. 그러나 내 경험을 보완 할 수 있다면.

우산 헤더는 빌드 프로세스에서 자동으로 식별됩니다. 대상의 빌드 설정에 지정되지 않았거나 프로젝트 설정에서 상속되지 않았습니다.

따라서이 오류를 방지하려면 -XCode 7 기준 -다음과 같습니다.

warning: no umbrella header found for target 'MyTarget', module map will not be generated

두 가지 중요한 단계를 거쳐야합니다.

첫째, 우산 헤더는 target과 동일한 이름을 가져야 합니다 . 따라서 대상이라는 프레임 워크 인 경우라는 MyTarget헤더가 있어야합니다.MyTarget.h .

둘째, MyTarget해당 답변에서 언급했듯이에 대한 빌드 단계 에서 해당 헤더 파일은 위에서 설명한대로 공개 섹션에 나열되어야합니다 .


1

나는 같은 문제가 있었고 제안 된 답변 중 어느 것도 내 경우에 도움이되지 않았으므로 누군가가 같은 문제를 겪을 경우를 대비하여 여기에 남겨 둡니다.

"빌드 단계"에서 "스크립트 실행"을 추가했지만 결국 제거하고 오류가 발생하기 시작했습니다.

내 솔루션은 결국 프로젝트를 정리하고 프레임 워크를 다시 빌드 한 다음 앱 프로젝트를 올바르게 빌드해야했습니다.


1

내 경험상 프로젝트 대상이 아닌 오류를 제공하는 프레임 워크를 대상에서 선택해야합니다.
그런 다음 컴파일하고 컴파일 한 후 프로젝트 대상에서 사용할 수 있습니다.


0

Xcode 7.1 및 CocoaPods 0.39를 사용하는 경우 일부 CocoaPods (Nimble, Quick 등)에 영향을 미치는 신속한 컴파일러 변경이있는 것 같습니다.이 스레드에 지정된 몇 가지 솔루션을 사용해보십시오. https://github.com/ CocoaPods / CocoaPods / issues / 4420 그러나 둘 다 작동하지 않으면 Xcode 7.0.1 또는 7.2 베타를 사용해보십시오. 두 가지 모두 https://developer.apple.com/downloads/ 에서 얻을 수 있습니다 .

편집 : 제 경우에는 문제를 해결하기 위해 CocoaPods도 0.38.2로 다운 그레이드해야했습니다.

나중에 편집 : Xcode 7.1과 관련이없는 것 같습니다. CocoaPods를 0.38.2로 다운 그레이드하면 도움이됩니다.

sudo gem uninstall cocoapods -v 0.39
sudo gem install cocoapods -v 0.38.2

@Marius Ursache에게 감사드립니다. 귀하의 지침에 따라 문제가 해결되었습니다.
Vick Swift

0

헤더 파일은 [Build Phases / Headers / Public] 섹션에 있어야합니다.

헤더 파일이 이미 [Build Phases / Headers / Public] 섹션에있는 경우 다음과 같이 여러 번 fallowing을 수행하여 문제를 해결했습니다.

  1. 프로젝트 청소
  2. 헤더 파일을 "개인"또는 "프로젝트"섹션으로 이동합니다.
  3. 헤더 파일을 "공용"섹션으로 다시 이동
  4. 모든 것을 다시 재건하십시오

와우 이것은이 수십 개의 답변 중에서 유일한 답변이며 가능성이 가장 적을 것 같습니다. 감사합니다!
Paolo

0

내 module.modulemap의 이름을 moduleXYZ.modulemap으로 바꾸고 프로젝트 설정에서 modulemap 파일 이름을 변경하여이 문제를 해결했습니다.


0

제 경우에는 그 체계로 특정 프레임 워크를 구축했습니다. 그런 다음 전체 프로젝트를 다시 빌드하고 문제를 해결했습니다.


0

빌드 설정의 "가져 오기 경로"에 포함하려는 파일이 포함되어 있는지 확인하십시오.


-1

프로젝트의 디렉토리에서 이러한 파일을 제거하십시오. .xcworkspace pods/podfile.lock

포드를 업데이트하고 프로젝트를 빌드합니다.


-1

문제가있는 프레임 워크 빌드 설정의 컴파일 모드를 증분으로 설정하여 문제를 해결했습니다.


-1

제 경우에는 빌드 단계에서 헤더 제거 스크립트로 인해 문제가 발생했습니다.

function removeHeaders() {  
    find $BUILD_ROOT/...  -name '*.h' -exec rm -f {} \;  
}  
removeHeaders

이 스크립트를 삭제하면 문제가 해결되었습니다.


-2

9 개의 답변 중 어느 것도 도움이되지 않았기 때문에 버그를 신고하기 위해 Apple에 보낼 수있는 새 프로젝트를 만들려고했습니다. 문제를 재현 할 수 없다는 사실에 놀랐습니다. 빌드 설정을 확인한 결과 동일했습니다. 분명히 이것은 일종의 버그입니다.

다른 방법이 도움이되지 않으면 새 프로젝트를 만들고 현재 프로젝트에서 Objective C 및 Swift 클래스를 가져오고 프레임 워크 관련 빌드 설정을 새 프로젝트의 기본값과 비교 한 다음 결국 모든 파일을 새 프로젝트.


-2

하루 종일 작업을 해왔지만 그만한 가치가 있습니다. 여기서 모든 방법을 시도했지만 해결하지 못했습니다. 나는 새로운 프로젝트, 실험을 만들었고 User Header Search Path$ {SRCROOT} recursive 로 설정되었고 그것을 $ {SRCROOT} non-recursive 로 변경하고 브리징 헤더 경로 (예 : #import "SVProgressHUD.h" -> #import "Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h")를 변경했습니다. 오류가 사라졌습니다.

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