Swift Framework: Không tìm thấy tiêu đề ô '[…] .h'


114

Trong khung tùy chỉnh có chứa cả mã Objective-CSwift , trình biên dịch Swift sẽ gặp lỗi sau:

[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'

Câu trả lời:


240

Điều này thường xảy ra sau khi đổi tên dự án hoặc tương tự như vậy. Vấn đề là tiêu đề ô không còn được liệt kê là tiêu đề Công khai . Kiểm tra hình ảnh đính kèm để xem cách sửa lỗi này.

Sửa chữa


7
Chỉ cần lưu ý với những độc giả trong tương lai rằng để xem phần 'Tiêu đề' của 'Xây dựng giai đoạn', bạn cần nhấp vào mục tiêu Pod. Mục tiêu ứng dụng chính sẽ không liệt kê phần 'Tiêu đề'.
shmim

3
Điều này hoàn toàn sửa chữa nó. Cảm ơn bạn. Đây phải là câu trả lời được chấp thuận.
Gujamin

16
Đối với tôi - cấp độ truy cập là công khai nhưng nó cũng bị lỗi khi không tìm thấy ô. Tôi đã chuyển phần "Tiêu đề" của "Các giai đoạn xây dựng" lên trên cùng và nó bắt đầu hoạt động.
Aleksei Minaev

6
Tiêu đề ô của tôi đã được công khai. Di chuyển phần lên đầu cũng không giúp được gì.
Rafael Bugajewski

1
Tôi đã gặp sự cố tương tự khi Carthage cập nhật một trong các khuôn khổ đã nhập của tôi. Tôi đoán XCode đang gặp khó khăn khi theo dõi các thay đổi đường dẫn khung tham chiếu. Khởi động lại XCode đơn giản đã khắc phục sự cố cho tôi.
Tony

48

Trong Xcode 7 Beta, với Swift 2, điều đó cũng sẽ xảy ra nếu Tiêu đề khung của bạn không được khai báo là "Công khai"

Ví dụ: tôi có Cocoa Touch Framework với khả năng hiển thị "Dự án" cho tệp tiêu đề và lỗi "Umbrella Header ... not found" cho tất cả các tệp Swift trong dự án của tôi, khi tôi có tiêu đề "Công khai", lỗi đã biến mất


1
Trong trường hợp của tôi, khi tôi gặp sự cố này, câu trả lời này có vẻ như là câu trả lời "đúng hơn" và nó phù hợp với tôi.
greymouser

1
Tôi đồng tình. Đây là câu trả lời chính xác. Kiểm tra để đảm bảo rằng tệp <project> .h có cấp độ truy cập và thành viên mục tiêu phù hợp (công khai).
user965972

@ Shadow_x99 làm cách nào để đặt tiêu đề là "Công khai", câu hỏi của tôi được đăng tại stackoverflow.com/questions/36084291/…
user2727195

Đây thực sự là một biến thể của câu trả lời của @ arturgrigor, ngoại trừ việc Xcode mà nó tự thực hiện thay đổi. Kết quả cuối cùng phải giống nhau.
original_username

40

Có 4 cách khác nhau để điều này có thể xảy ra, bỏ qua các lỗi trong các phiên bản Xcode trước

  • Bạn không có tiêu đề ô có tên $ (TARGET_NAME) .h trong dự án của mình
  • Bạn có một tiêu đề ô, nhưng nó không được đặt là công khai. Xem câu trả lời của arturgrigor
  • DEFINES_MODULE không được đặt thành YES
  • CLANG_ENABLE_MODULES không được đặt thành YES

3
Một nguyên nhân thứ 5 mà tôi chỉ tìm thấy: umbrella_header.h bản thân phải không được kiểm tra trong bất kỳ mục tiêu (cũng giống như Info.plist)
nalexn

3
Tôi đã đặt đúng mọi thứ trong danh sách này, nhưng nó không thành công.
Erik Aigner

25

Điều này sẽ xảy ra khi Always Search User Pathscài đặt được bật cho mục tiêu Khung.

Đặt nó thành Nosẽ giải quyết được lỗi đó.

IMHO, đây là một lỗi trong Trình biên dịch Swift và tôi đã đệ trình lên Apple.
Xem rdar: // 21038443


1
Cảm ơn! Đây là cái mà tôi cũng vậy.
Chris Hatton

Điều này đã làm việc cho tôi. Một triệu chứng khác là nó không thành công ngay sau khi làm sạch, nhưng đã thành công nếu bạn thử lại mà không làm sạch.
Ben Leggiero

18

Đối với tôi - cấp độ truy cập là công khai nhưng nó cũng bị lỗi khi không tìm thấy ô. Tôi đã chuyển phần "Tiêu đề" của "Các giai đoạn xây dựng" lên trên cùng và nó bắt đầu hoạt động. Tập lệnh cho 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

Không có manh mối tại sao nó đang xảy ra. Đã thử các dự án giả - không xảy ra. Chỉ trên những cái lớn có nhiều phụ thuộc. Một cái gì đó với việc biên dịch TRƯỚC khi sao chép các tiêu đề ô.


4
Việc di chuyển "Tiêu đề" lên trên "Nguồn biên dịch" phù hợp với tôi. xCode 8.2.1.
Rob Paterson

Việc di chuyển các pha đánh đầu lên đầu cũng có tác dụng với tôi.
Søren Mortensen

PodfileTệp không hợp lệ : lỗi cú pháp, kết thúc đầu vào không mong muốn, kết thúc từ khóa.
Volodymyr Kulyk

13

Chắc chắn bạn phải đặt khuôn khổ của mình ở chế độ công khai:

nhập mô tả hình ảnh ở đây


1
Hoạt động hoàn hảo. Cảm ơn rất nhiều!
kkiermasz

Bối cảnh của ảnh chụp màn hình đó là gì? Bạn bấm gì để đến đó?
pkamb

7

Đối với tôi, việc đặt 'Sử dụng Bản đồ tiêu đề' thành 'KHÔNG' đã giải quyết được vấn đề


… Và trong trường hợp của tôi, việc đặt thành CÓ đã khắc phục được sự cố. Thật không may, dường như không có bất kỳ tài liệu nào về cài đặt này, nhưng có là mặc định và tôi không chắc tại sao nó được đặt thành không cho một trong các mục tiêu của tôi.
robotspacer

7

Một giải pháp khác: Sau khi đổi tên một thư mục, vị trí cũ có thể vẫn được liệt kê trong tệp dự án cho tệp .h, ngay cả khi bạn đã cập nhật vị trí thông qua thanh bên của Xcode. Vị trí cũ này gây ra lỗi tiêu đề ô.

Giải pháp đơn giản: Xóa tham chiếu đến tệp .h và thêm lại. (và sau đó nhớ công khai lại!)


5

Tôi thấy rằng với Hệ thống xây dựng Swift mới và Bản dựng song song được bật trên lược đồ, tôi sẽ gặp lỗi như trong câu hỏi này. Giải pháp là liên kết đến các khuôn khổ đã được nhập vào các tệp nguồn nhanh chóng. (Tôi nghĩ trước đây ứng dụng sẽ xây dựng bởi vì nó chỉ xảy ra rằng các khung công tác được liên kết với một cái gì đó được xây dựng trước đó trong hàng đợi xây dựng nối tiếp).

Tôi đã viết một tập lệnh để đi qua tất cả các lần nhập trong tất cả các mục tiêu trong một không gian làm việc và đảm bảo rằng các khuôn khổ của chúng đã được liên kết với mục tiêu đó.

https://github.com/Jon889/SwiftImportChecker


4

Đã có một số câu trả lời tuyệt vời ở đây. @ Shadow_x99's rất hữu ích. Tuy nhiên, nếu tôi có thể được phép bổ sung kinh nghiệm của mình.

Tiêu đề ô được xác định tự động trong quá trình xây dựng. Nó không được chỉ định trong cài đặt xây dựng của mục tiêu hoặc được kế thừa từ cài đặt dự án.

Vì vậy, để tránh lỗi này - kể từ XCode 7 - như sau;

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

hai bước quan trọng phải được thực hiện.

Đầu tiên, tiêu đề ô phải có cùng tên với đích . Vì vậy, nếu mục tiêu của bạn là một khuôn khổ được đặt tên MyTarget, thì phải có một tiêu đề được đặt tên MyTarget.h.

Thứ hai, trong các giai đoạn xây dựng MyTarget- như đã đề cập trong câu trả lời đó - tệp tiêu đề đó phải được liệt kê trong phần công khai như chi tiết ở trên.


1

Tôi đã gặp vấn đề tương tự và không có câu trả lời được đề xuất nào giúp ích cho trường hợp của tôi, vì vậy tôi sẽ để điều này ở đây trong trường hợp ai đó có cùng vấn đề.

Tôi đã thêm "Run script" trong "Build phase" nhưng cuối cùng lại xóa nó và đó là lúc tôi bắt đầu gặp lỗi.

Giải pháp của tôi cuối cùng phải làm sạch dự án, xây dựng lại khuôn khổ của tôi và sau đó dự án ứng dụng của tôi được xây dựng chính xác.


1

Theo kinh nghiệm của tôi, bạn phải chọn trên các mục tiêu mà khuôn khổ đang gây ra lỗi cho bạn, không phải mục tiêu dự án.
Sau đó, biên dịch, và sau khi biên dịch, nó sẽ có sẵn trên mục tiêu của dự án.


0

Nếu bạn đang sử dụng Xcode 7.1 và CocoaPods 0.39, có vẻ như có một thay đổi trình biên dịch nhanh chóng ảnh hưởng đến một số CocoaPods (Nimble, Quick, v.v.) Hãy thử một số giải pháp được chỉ định trong chuỗi này: https://github.com/ Tuy nhiên, CocoaPods / CocoaPods / issue / 4420 , nếu cả hai đều không hoạt động, hãy thử sử dụng Xcode 7.0.1 hoặc 7.2 beta. Bạn có thể tải cả hai ở đây: https://developer.apple.com/downloads/ .

Chỉnh sửa: Trong trường hợp của tôi, để khắc phục sự cố, tôi cũng phải hạ cấp CocoaPods xuống 0.38.2.

Chỉnh sửa sau: Có vẻ như không liên quan đến Xcode 7.1. Chỉ cần hạ cấp CocoaPods xuống 0.38.2 sẽ giúp:

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

Cảm ơn @Marius Ursache. Làm theo hướng dẫn của bạn đã giải quyết vấn đề cho tôi.
Vick Swift

0

Tệp tiêu đề của bạn cần nằm trong phần [Tạo giai đoạn / Tiêu đề / Công khai].

Nếu tệp tiêu đề của bạn đã có trong phần [Xây dựng giai đoạn / Tiêu đề / Công khai], nhiều lần thực hiện theo kiểu nguỵ biện đã giải quyết được vấn đề của tôi:

  1. làm sạch dự án
  2. di chuyển tệp tiêu đề đến phần "riêng tư" hoặc "dự án"
  3. di chuyển tệp tiêu đề trở lại phần "công khai"
  4. xây dựng lại mọi thứ một lần nữa

Chà, đây là câu trả lời duy nhất trong số hàng tá câu trả lời này và có vẻ như nó sẽ ít có khả năng xảy ra nhất, cảm ơn!
Paolo

0

Tôi đã giải quyết vấn đề này bằng cách đổi tên module.modulemap của mình thành moduleXYZ.modulemap và thay đổi tên tệp modulemap trong cài đặt dự án


0

Trong trường hợp của tôi, tôi chỉ xây dựng một khung cụ thể với lược đồ của nó. Và sau đó xây dựng lại toàn bộ dự án và nó đã giải quyết được vấn đề


-1

Xóa các tệp này khỏi thư mục của dự án. .xcworkspace pods/podfile.lock

cập nhật pod và xây dựng dự án.


-1

Tôi đã sửa nó bằng cách đặt Chế độ biên dịch của cài đặt xây dựng khuôn khổ có vấn đề thành Tăng dần.


-1

Trong trường hợp của tôi, sự cố là do loại bỏ tập lệnh tiêu đề trong các giai đoạn xây dựng

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

Xóa tập lệnh này đã khắc phục được sự cố.


-2

Không có câu trả lời nào trong số 9 câu trả lời giúp ích cho tôi, vì vậy tôi đã cố gắng tạo một dự án mới mà tôi có thể gửi cho Apple để gửi lỗi. Tôi ngạc nhiên rằng tôi không thể tái tạo vấn đề. Tôi đã kiểm tra cài đặt bản dựng và chúng tương đương nhau. Rõ ràng đây là một số loại lỗi.

Nếu không có cách nào khác hữu ích , hãy cố gắng tạo một dự án mới và nhập ít nhất một số lớp Objective C & Swift từ dự án hiện tại của bạn, so sánh cài đặt xây dựng liên quan đến khung của bạn với giá trị mặc định từ dự án mới và cuối cùng chuyển tất cả các tệp sang dự án mới.


-2

Tôi đã làm việc trong cả ngày, nhưng nó đáng giá , tôi đã thử mọi cách ở đây, nhưng tôi không giải quyết được nó. Tôi đã tạo một dự án mới, một thử nghiệm và tôi phát hiện ra rằng Đường dẫn tìm kiếm tiêu đề người dùng đã được thiết lập $ {SRCROOT} đệ quy và tôi đã thay đổi nó thành $ {SRCROOT} không đệ quy , đã thay đổi đường dẫn tiêu đề bắc cầu (ví dụ #import "SVProgressHUD.h" -> #import "Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h"), lỗi đã biến mất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.