Bắt "không tìm thấy tệp" trong Bridging Header khi nhập các khung Objective-C vào dự án Swift


96

Tôi có một dự án Swift mà tôi đang cố gắng nhập các khuôn khổ dựa trên ObjC. Khung công tác nằm trong một thư mục dưới đường dẫn của dự án và được tham chiếu bởi dự án trong Xcode. Nó cũng được thêm vào "Liên kết nhị phân với thư viện" trong trang 'Xây dựng giai đoạn' của dự án.

Tuy nhiên, vì một số lý do, tôi dường như không thể đưa khuôn khổ vào tệp Bridging-Header. Tôi nhận được lỗi sau đây:

BridgingHeader.h:5:9: error: 'Parse/Parse.h' file not found
#import <Parse/Parse.h>
        ^
<unknown>:0: error: failed to import bridging header 'BridgingHeader.h'

Những thứ tôi đã kiểm tra:

  1. "Cài đặt Tiêu đề Tương thích Mục tiêu-C" được đặt thành "CÓ".
  2. Đường dẫn Tìm kiếm Tiêu đề bao gồm đường dẫn đến các khuôn khổ.

Tôi chắc chắn rằng tôi đang thiếu một cái gì đó, vì vậy nếu ai đó có bất kỳ manh mối nào, điều đó sẽ rất tuyệt.


3
i quên đặt đường dẫn thư viện trong Header Search Paths, trong trường hợp này câu hỏi giúp: D
Aishwat Singh

Câu trả lời:


78

Đã tìm ra giải pháp:

  • Cài đặt "Tiêu đề kết nối Mục tiêu-C" (hay còn gọi là SWIFT_OBJC_BRIDGING_HEADER) phải được đặt ở cấp Mục tiêu chứ KHÔNG phải cấp Dự án. Đảm bảo xóa giá trị cài đặt ở cấp độ Dự án.

(đối với tôi, nó có vẻ giống như một lỗi Xcode, vì tôi không biết tại sao nó lại sửa được).


1
Điều này thực sự kỳ lạ, tôi đã gặp lỗi tương tự và hóa ra tôi đã xác định tiêu đề ở cấp Dự án. Mặc dù tôi đã xác định nó ở cấp Target, tôi phải xóa nó khỏi cấp Project để cho phép thêm các Framework của bên thứ ba. Có vẻ như đó là một lỗi Xcode.
Jojodmo

2
@MarcoAlmeida, nếu bạn có mục tiêu thử nghiệm, hãy thử xóa cài đặt "Tiêu đề kết nối Objective-C" khỏi mục tiêu đó. Nó sẽ giúp.
Davlat Mirmanov

3
Không thể tin được. Cảm ơn bạn.
Darren

1
Này! Có cùng một vấn đề ở đây :( Mặc dù nó không được giải quyết với sự mô tả ở trên phương pháp ...
Mike K

1
Điều này đã làm việc cho tôi trong Xcode 9.2. Vẫn chưa được sửa sau nhiều năm ...
Oliver Eichhorn

58

Tôi có cùng một vấn đề. Ví dụ, tôi đã thay đổi tất cả các mục nhập của mình từ #import "HMSegmentedControl.h"sang #import <HMSegmentedControl/HMSegmentedControl.h>.


7
Để làm việc với cocoapod, điều này là cần thiết. Trong tiêu đề Cầu nối, không bao giờ nhập nhóm dưới dạng #import "abc.h" người dùng #import <abc / abc.h> Thích.
NaXir

1
Bạn là thần! Cảm ơn rất nhiều vì điều này.
Alper

Trong trường hợp của tôi, tôi chuyển #import <ios-qr-encoder / UIImage + MDQRCode.h> để #import "UIImage + MDQRCode.h" và nó làm việc
Mashhadi

Bạn là vua
Itai Spector

27

Tôi đã phải thêm libthư mục của mình vào Đường dẫn Tìm kiếm Tiêu đề Người dùng:

kiểm tra cài đặt mục tiêu - đường dẫn tìm kiếm tiêu đề người dùng

Trong trường hợp của tôi, libthư mục chứa .atệp -library và một số tệp tiêu đề. Chúng được bao gồm trong tệp tiêu đề bắc cầu. Tuy nhiên, trình biên dịch nhanh sẽ không tìm thấy chúng. Chỉ khi tôi thêm vào ${PROJECT_DIR}/libĐường dẫn Tìm kiếm Tiêu đề Người dùng, nó mới xây dựng mục tiêu thử nghiệm.

(Tôi đang sử dụng Xcode 6.2 trên Mavericks 10.9.5)


1
Tôi có thể giải quyết vấn đề này bằng cách thêm Nhóm / * vào Đường dẫn tìm kiếm tiêu đề của mục tiêu chính. Thật thú vị, tôi đã không gặp vấn đề này trước khi thêm các khung Swift làm phụ thuộc vào mục tiêu của mình. Xcode 7 beta 6.
bizz84

Đây chính xác là những gì đã làm việc cho tôi. Tôi có một khuôn khổ bao gồm trong dự án của tôi có chứa thư viện (.a). Tôi phải tạo một đường dẫn tìm kiếm đến các tiêu đề cho thư viện trong Đường dẫn Tìm kiếm Tiêu đề Người dùng.
Chris Livdahl

Cũng phải nhập Pods / thư mục thư viện, cảm ơn bạn rất nhiều!
thibaut noah

17

Chúng tôi đã gặp cùng một thông báo lỗi, với một nguyên nhân hoàn toàn khác.

Thiết lập:

  • Mục tiêu ứng dụng, tất cả mã Obj-C
  • Mục tiêu Unit Test với một trường hợp thử nghiệm nhanh duy nhất và một tiêu đề bắc cầu đề cập đến mã ứng dụng

Khi chúng tôi thêm trường hợp thử nghiệm nhanh thứ hai, sau khi sạch (hoặc trên máy của đồng đội), chúng tôi đã thấy lỗi này khi xây dựng mục tiêu thử nghiệm đơn vị.

Nó đã được sửa bằng cách thêm một lớp obj-C giả vào mục tiêu kiểm tra đơn vị.


5
Cảm ơn bạn. Điều này hoàn toàn hiệu quả mặc dù hoàn toàn không có ý nghĩa.

Tôi đã có thể xóa lớp obj-C giả sau đó. Tôi đoán rằng một tác dụng phụ của giải pháp này là việc tạo ra một tiêu đề bắc cầu dành riêng cho mục tiêu thử nghiệm, do đó (tôi nghi ngờ) khiến Xcode bỏ qua tiêu đề bắc cầu của ứng dụng máy chủ.
clozach

Phụ lục ở trên: sau khi thực hiện một bản dựng sạch, tôi bắt đầu gặp lỗi phân đoạn 11 trong khi biên dịch. Sau một số thử nghiệm và lỗi, có vẻ như tệp .m giả phải có mặt, nhưng nó thể trống. Điên cuồng.
clozach

Thêm một lớp objc giả vào mục tiêu thử nghiệm của tôi, đã sửa nó cho tôi!
neoneye

5

Nếu sử dụng cocoapods, hãy thử cài đặt lại các nhóm bằng cách chạy lệnh sau.

pod install

Điều này đã giúp tôi vì gần đây tôi đã tạo một Cấu hình mới không được biên dịch (cùng một tệp không tìm thấy sự cố), trong khi các cấu hình khác (Gỡ lỗi và Phát hành) thì có. pod installdường như được yêu cầu đối với bất kỳ cấu hình mới nào được thêm vào ...
Mete

5

Điều này bằng cách nào đó đã làm cho tôi mẹo:

  • Dự án sạch
  • Làm sạch thư mục xây dựng
  • Khởi động lại Xcode

Không đi kèm với các câu trả lời chung chung không trúng và thử trics.
Nico

Thủ thuật đánh & thử cụ thể này đòi hỏi ít nỗ lực hơn, vì vậy bạn không nên thử khi đang nghĩ đến các giải pháp khác. ;)
Hlung

1
Đáng buồn thay, mẹo nhấn & thử cụ thể này thường là câu trả lời chính xác.
Robert Schmid,

5

Lỗi này xuất hiện khi cài đặt với Cocoapods thư viện CocoaImageHashing. Vấn đề là các đường dẫn tìm kiếm bị sai. Vì vậy, ở cấp Mục tiêu, trong Cài đặt bản dựng -> Đường dẫn tìm kiếm -> Đường dẫn tìm kiếm tiêu đề, các đường dẫn tương ứng với các thư mục không tồn tại, ví dụ: "$ {PODS_ROOT} / Headers / Public / CocoaImageHashing", khi cấu trúc thư mục Headers / Public / không tồn tại. Tôi đã thêm đường dẫn $ {PODS_ROOT} / CocoaImageHashing và lỗi đã biến mất.


4

Hơi lạ nhưng tôi đoán bạn phải thêm tài nguyên vào giai đoạn "Tài nguyên gói sao chép" của mục tiêu thử nghiệm để làm cho nó tải tất cả các tiêu đề từ mục tiêu ứng dụng chính của bạn. Trong trường hợp của tôi, tôi đã thêm main.storyboardvà nó đã xử lý lỗi.

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


4

Điều này đã xảy ra với tôi sau khi thêm / đổi tên các cấu hình hiện tại và nó có ý nghĩa.

Mọi cấu hình đều sử dụng Bộ cấu hình do cocoapods tạo nên những thứ này cần phải khớp.

Vì vậy, nếu bạn thêm / đổi tên các cấu hình, những cấu hình này sẽ cần phải sử dụng các bộ cấu hình phù hợp và việc chạy pod installsẽ thực hiện được.


3

Nếu giúp đỡ bất cứ ai.

Trong trường hợp của tôi, các tệp obj-c của tôi đã được thêm vào có một thư mục tham chiếu (các thư mục màu xanh lam trong xcode) và tiêu đề không thể tìm thấy chúng. Chỉ cần thêm các tệp, không phải thư mục, từ công cụ tìm đến xcode và giải quyết.


2

Tôi đã từng gặp vấn đề tương tự. Đối với tôi, lý do là tôi đang sử dụng cùng một tiêu đề bắc cầu cho cả Ứng dụng và Tiện ích mở rộng ngày hôm nay của tôi. Phần mở rộng Ngày hôm nay của tôi không bao gồm Phân tích cú pháp, nhưng vì nó đã được định nghĩa trong tiêu đề bắc cầu nên nó đang cố gắng tìm kiếm nó. Tôi đã tạo một tiêu đề bắc cầu mới cho Tiện ích mở rộng Hôm nay của mình và lỗi đã biến mất.


Không giống như vấn đề tương tự mà tôi gặp phải. Tôi không có tiện ích mở rộng Hôm nay. Trong trường hợp của tôi, tôi đang sử dụng tiêu đề bắc cầu cho ứng dụng và khung phân tích cú pháp được bao gồm trong các phần phụ thuộc của ứng dụng. Lỗi cũng xảy ra cho các khung công tác khác, không chỉ Phân tích cú pháp.
Dia Kharrat

2

Khuôn khổ của tôi đang hoạt động trước đó và đột nhiên ngừng hoạt động và không có câu trả lời nào trong số này phù hợp với tôi. Tôi đã xóa khuôn khổ trong Các giai đoạn xây dựng> Liên kết Nhị phân Với Thư viện và thêm lại nó. Bắt đầu hoạt động trở lại.


2

Tôi đã gặp sự cố và đã khắc phục sự cố sau 2 giờ để tìm. Môi trường của tôi như dưới đây:

kén 0,39.0

nhanh chóng 2.x

XCode 7.3.1

Các bước:

  1. đường dẫn dự án: project_name / project_name / your_bridging_header.h
  2. Trong phần Swift tại Build Setting, Objective-C Bridging Header phải là: project_name / your_bridging_header.h
  3. Trong your_bridging_header.h , hãy thay đổi tất cả các khai báo từ .h thành #import
  4. Trong lớp học đang được sử dụng your_3rd_party . Khai báo import your_3rd_party

Câu trả lời của bạn là đúng, chỉ cần thêm câu trả lời @jamesthakid ở điểm thứ ba để làm rõ hơn. Làm việc cho tôi cảm ơn.
NaXir

5
Chính xác thì ý bạn là gì khi "thay đổi tất cả các khai báo từ .h thành #import"?
Chris Gunawardena

1

Tôi vừa sao chép một sơ đồ hiện có và thêm một cấu hình khác vào dự án. Tôi đã phải thêm một cấu hình có cùng tên vào dự án của khuôn khổ để nó cũng xây dựng trong cùng một DerivedData/($AppName)/Build/Products/($CONFIGURATION_NAME)thư mục. Nếu không, tệp .framework không được tạo và do đó không thể nhập được.


1

Tôi gặp phải vấn đề tương tự ngày hôm nay khi cố gắng sử dụng nhóm được viết bằng Objective-C trong dự án Swift của mình, không có giải pháp nào ở trên có vẻ hoạt động.

Trong podfile tôi đã use_frameworks!viết. Nhận xét dòng này và sau đó chạy pod installlại đã giải quyết được vấn đề này cho tôi và lỗi đã biến mất.


1

(Cập nhật ngày 27 tháng 5 năm 2017)

Xcode 8. Dự án Swift - nhập Mục tiêu C.

Những điều cần biết:

  1. Tệp tiêu đề cầu nối PHẢI được lưu trong thư mục của dự án. (nghĩa là không được lưu ở cùng cấp mà .xcodeproj được lưu, mà thay vào đó là một cấp thấp hơn vào các thư mục nơi tất cả các tệp c nhanh và mục tiêu của bạn được lưu). Nó vẫn có thể tìm thấy tệp ở cấp cao nhất, nhưng nó sẽ không liên kết chính xác và có thể nhập tệp Objective C vào tệp tiêu đề bắc cầu
  2. Tệp tiêu đề bắc cầu có thể được đặt tên bất kỳ thứ gì, miễn là tệp tiêu đề .h
  3. Đảm bảo đường dẫn trong Cài đặt xây dựng> Trình biên dịch Swift - Chung> Tiêu đề bắc cầu Mục tiêu C trỏ chính xác đến bạn tệp tiêu đề bắc cầu mà bạn đã tạo
  4. QUAN TRỌNG: nếu bạn vẫn nhận được thông báo "không tìm thấy", trước tiên hãy thử làm trống tệp tiêu đề bắc cầu của bạn và xóa bất kỳ nhập nào bạn hiện đã viết ở đó. Đảm bảo rằng tệp tiêu đề bắc cầu có thể được tìm thấy trước, sau đó bắt đầu thêm mục nhập c vào tệp đó. Vì một số lý do, nó sẽ phát lại cùng một lỗi "không tìm thấy" ngay cả khi nó được tìm thấy nhưng nó không thích việc nhập của bạn vì một lý do nào đó
  5. Bạn không nên #i nhập "MyBridgingHeaderFile.h" vào bất kỳ tệp C mục tiêu nào của mình. Điều này cũng sẽ gây ra lỗi "không tìm thấy tệp"

1
Tất cả những điểm này đều được kiểm tra và vẫn có cùng một vấn đề :( Bất kỳ điểm thêm nên được xem xét?
Amjad Husseini

@AmjadHusseini cố gắng xóa các tệp dự án của bạn, sau đó xóa dữ liệu bắt nguồn từ dự án của bạn rồi khởi động lại xCode. điều đó đã làm việc với tôi
Mohammad Allam

0

Tôi đã gặp vấn đề tương tự và chỉ có một giải pháp phù hợp với tôi. Tôi đã thử mọi thứ được đề xuất và tôi biết rằng tôi đã đặt tiêu đề bắc cầu của mình tốt, vì tôi có một số lib khác đang hoạt động.

Khi tôi sao chép thư viện (kéo và thả) vào dự án mà không có Cocoapods, chỉ sau đó tôi có thể nhập tiêu đề mà không có lỗi.

Tôi đã sử dụng facebook / thư viện Shimmer.


0

Tôi đã gặp vấn đề tương tự với nhóm. Về cơ bản đang cố gắng chạy các bài kiểm tra giao diện người dùng của tôi, Xcode đã phàn nàn về việc thiếu các nhóm. Giải pháp cho điều này đơn giản hơn nhiều so với bất kỳ giải pháp nào được mô tả ở trên:

  1. đi đến tệp dự án (chính không phải là mục tiêu)
  2. nhấp vào tab "Thông tin" (ngoài cùng bên trái)
  3. đặt cấu hình nhóm thích hợp cho mục tiêu kiểm tra giao diện người dùng (phần "Cấu hình" ngay trong "Mục tiêu triển khai")

Đang làm việc!

Tôi đã tìm thấy nó trong một chuỗi: https://github.com/CocoaPods/CocoaPods/issues/2695

Nghe có vẻ hơi giống một lỗi đối với quả ca cao nhưng tôi có thể thấy lý do tại sao nó có thể là một trường hợp phức tạp.


0

Trong trường hợp của tôi, tôi chỉ cần thoát khỏi trình mô phỏng ...


0

Làm sạch dự án, Làm sạch thư mục xây dựng, Khởi động lại Xcode. Tôi chỉ cần xóa đường dẫn tại goto dự án> Cài đặt xây dựng> Tìm kiếm từ khóa. Swift Compiler - General -> Objective-C Bridging header phù hợp với tôi.


0

Tháng 8 năm 2019

Trong trường hợp của tôi, tôi muốn sử dụng giao thức Swift trong tệp tiêu đề Objective-C đến từ cùng một mục tiêu và đối với điều này, tôi cần sử dụng một khai báo chuyển tiếp của giao thức Swift để tham chiếu nó trong giao diện Objective-C. Điều này cũng hợp lệ để sử dụng một lớp Swift trong tệp tiêu đề Objective-C. Để sử dụng khai báo chuyển tiếp, hãy xem ví dụ sau từ tài liệu tại Bao gồm các lớp Swift trong Tiêu đề Objective-C Sử dụng Khai báo Chuyển tiếp :

// MyObjcClass.h
@class MySwiftClass; // class forward declaration
@protocol MySwiftProtocol; // protocol forward declaration

@interface MyObjcClass : NSObject
- (MySwiftClass *)returnSwiftClassInstance;
- (id <MySwiftProtocol>)returnInstanceAdoptingSwiftProtocol;
// ...
@end
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.