Bao gồm tiêu đề không mô-đun bên trong mô-đun khung


143

Tôi đang sử dụng Xcode 6,

1) Trước tiên, tôi đang tạo một thư viện động (CoreL Library). Thư viện này chứa tệp RequestPoster.h.

2) Sau đó, tôi tạo một Khung cảm ứng ca cao và thêm thư viện động này (CoreL Library).

3) Sau đó, khung này được thêm vào dự án của tôi và nó báo lỗi trong tệp RequestPoster.h (CoreL Library).

Lỗi: Bao gồm tiêu đề không mô-đun bên trong lớp mô-đun khung:

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

Những tập tin không tìm thấy trong dự án.

Câu trả lời:


190

Hãy thử xây dựng Cài đặt trong "Mục tiêu" và đặt "Cho phép không bao gồm mô-đun trong Mô-đun khung" thành CÓ.

Câu trả lời thực sự là vị trí của hàng nhập khẩu cần được thay đổi bởi chủ sở hữu thư viện. Các tệp ifaddrs.h, arpa / inet.h, sys / type.h đang được nhập trong tệp .h trong khung, mà Xcode không thích. Người bảo trì thư viện nên chuyển chúng sang tệp .m. Xem ví dụ về vấn đề này trên GitHub, nơi AFNetworking đã khắc phục vấn đề tương tự: https://github.com/AFNetworking/AFNetworking/issues/2205


2
Trong trường hợp tiêu đề có lỗi đang sử dụng một loại từ các tiêu đề đã nhập, khuyến nghị gì? Ví dụ: nếu tiêu đề module.h trong mô-đun khai báo một hàm lấy tham số loại ifaddrs, chúng bị ràng buộc để nhập ifaddrs.h.
Ayush Goel

Nhưng nếu hệ thống của họ bao gồm, như thế /usr/include/libproc.hnào?
Ben Leggiero

3
Bạn có thể giải thích tác động của việc thay đổi là gì: Cho phép Không mô-đun Bao gồm trong các Mô-đun khung
nr5

170

Đảm bảo các tệp tiêu đề có sẵn công khai như một phần của tiêu đề công khai của khung.

Goto Framework -> Target -> Build Phase và kéo để di chuyển các tệp tiêu đề có liên quan từ Project sang Public. Mong rằng sẽ giúp!

Ảnh chụp màn hình


3
Điều đó đã giúp tôi đưa mã Objective C vào khung Swift, cảm ơn!
Vadim

1
Bạn cũng có thể thực hiện thay đổi này thành Thành viên mục tiêu từ Dự án thành Công khai trong tệp của mình bằng cách sử dụng cửa sổ Trình kiểm tra tệp ở bên phải màn hình chính của XCode.
Pigpocket

Nếu nhập thư viện vào hỗn hợp swift / objc, cần đảm bảo tiêu đề bắc cầu cũng được công khai. Sai lầm tôi đã làm!
Nick H247

74

Bạn có thể đặt Cho phép Không mô-đun bao gồm trong Mô-đun khung trong Cài đặt bản dựng cho mục tiêu bị ảnh hưởng thành CÓ. Đây là cài đặt bản dựng bạn cần chỉnh sửa:

Xây dựng mục Cài đặt bạn cần chỉnh sửa

LƯU Ý : Bạn nên sử dụng tính năng này để phát hiện ra lỗi cơ bản mà tôi thường thấy do sự trùng lặp của toàn cầu có khung bao gồm trong các tệp có một số mối quan hệ phụ thuộc, nghĩa là:

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

Nếu cài đặt Cho phép Không mô-đun bao gồm trong Mô-đun khung thành dẫn đến một tập hợp các lỗi "X là một tham chiếu mơ hồ" hoặc một cái gì đó thuộc loại này, bạn sẽ có thể theo dõi (các) bản sao vi phạm và loại bỏ chúng. Sau khi bạn đã dọn sạch mã của mình, hãy đặt Cho phép Không mô-đun bao gồm trong Mô-đun khung trở về NO .


1
Ok, đó là dấu ngoặc nhọn gây ra vấn đề! Tôi đã gặp vấn đề này với quá trình nhập vào Cốc Cốc và sửa nó bằng cách thay đổi nhập để sử dụng dấu ngoặc kép thay vì dấu ngoặc nhọn.
Michael Forrest

Rất tiếc, không, không. Phát hiện ra nó đã bị hỏng sau khi tôi dọn dẹp dự án của mình: - /
Michael Forrest

2
Tôi không thể tìm thấy bất kỳ cảnh báo 'tham chiếu mơ hồ' nào. Những hạn chế của việc để nó được đặt thành CÓ là gì?
Nicolas Miari

28

Tôi đã có cùng một vấn đề và giải quyết nó bằng cách chỉ công khai tệp tiêu đề. [vấn đề]

Nếu bạn đang làm việc trên nhiều mô-đun trong dự án của bạn. Sau đó, tệp tiêu đề của bạn cần được công khai để được sử dụng trong các phần khác của dự án. Những gì bạn cần là chọn tệp tiêu đề đó và trong chế độ xem Tiện ích dự án. Thay đổi tệp từ Dự án / Riêng tư thành Công khai. Xem hình ảnh dưới đây:

Thay đổi phạm vi tệp tiêu đề


Điều này đặc biệt xảy ra khi bạn sao chép tiêu đề công khai hiện có, tư cách thành viên tiêu đề trùng lặp được đổi thành "dự án"
Jeremie

không, nó không bắt buộc cho điều trùng lặp. Nó có thể xảy ra do các trường hợp khác nhau, ví dụ nếu bạn nhập một số dự án dưới dạng thư viện hoàn toàn trong dự án của bạn và sau đó bạn cố gắng sửa đổi các lớp riêng. Bạn biết tệp tiêu đề và viết nó nhưng quyền truy cập không công khai cho tất cả các dự án.
Saad

22

"Bao gồm tiêu đề không mô-đun bên trong mô-đun khung"

Khi bạn gặp lỗi này, giải pháp trong một số trường hợp có thể chỉ đơn giản là đánh dấu tệp bạn đang cố nhập là "công khai" trong trình kiểm tra tệp "Tư cách thành viên mục tiêu". Mặc định là "Project" và khi được đặt theo cách này, nó có thể gây ra lỗi này. Đó là trường hợp với tôi khi cố gắng nhập các tiêu đề của Google Phân tích vào một khung, chẳng hạn.


Câu trả lời này đã giúp tôi rất nhiều trong vấn đề tương tự của tôi. Tôi không biết các tệp tiêu đề khung có thể được thêm vào mục tiêu. Trong các dự án ứng dụng, các tiêu đề không bao giờ là một phần của mục tiêu.
sinh học

20

Trên thực tế, một cách dễ dàng hơn để khắc phục điều này là di chuyển #importcâu lệnh lên đầu .mtệp thay vì (thay vì có nó trong .htệp tiêu đề của bạn ). Bằng cách này, nó sẽ không phàn nàn rằng nó bao gồm một tệp tiêu đề không phải mô-đun. Tôi có vấn đề này mà Allow non-module includesthiết lập để YESlàm KHÔNG làm việc đối với tôi, vì vậy bằng cách di chuyển nó đến tập tin thực hiện, nó dừng lại phàn nàn. Trên thực tế đây là cách nhập ưa thích và bao gồm các tệp tiêu đề. Một khi bạn đã làm điều này, thiết lập lại này NOsẽ hoạt động.

Lý tưởng nhất là chúng ta nên cố gắng và đặt mục tiêu đã Allow non-module includesthiết lập NO. Đặt điều này thành YEStrong hầu hết các trường hợp có nghĩa là bạn đang làm gì đó sai. Cài đặt dịch thành "Cho phép nhập tệp tiêu đề ngẫu nhiên trên đĩa không phải là một phần của mô-đun". Điều này áp dụng cho rất ít trường hợp sử dụng trong thực tế và vì vậy cài đặt này phải luôn luôn NO(tức là giá trị mặc định).


10

Trong trường hợp nếu bạn đang phát triển khuôn khổ của riêng bạn:

Tại sao chuyện này đang xảy ra?

Nếu bất kỳ tệp tiêu đề công khai nào bạn đã đề cập trong module.modulemap của bạn có các câu lệnh nhập không được đề cập trong modulemap, điều này sẽ gây ra lỗi cho bạn. Vì nó cố gắng nhập một số tiêu đề không được khai báo là mô-đun (trong module.modulemap), nên nó phá vỡ tính mô-đun của khung.

Làm thế nào tôi có thể sửa chữa nó?

Chỉ cần bao gồm tiêu đề đã đưa ra lỗi cho module.modulemap của bạn và xây dựng lại!

TẠI SAO KHÔNG chỉ đặt cho phép không mô-đun thành CÓ?

Bởi vì nó không thực sự là một giải pháp ở đây, với điều đó bạn nói với dự án của bạn "khung này được cho là mô-đun nhưng không phải vậy. Sử dụng nó bằng cách nào đó, tôi không quan tâm." Điều này không khắc phục vấn đề mô đun thư viện của bạn.

Để biết thêm thông tin kiểm tra bài đăng blog này hoặc tham khảo tài liệu clang .


Làm thế nào bạn thiết lập nó cho module.modulemap với khung dự án ca cao, tôi đã cố gắng để thư viện của mình có thể hoạt động với các dự án chỉ dành cho Swift, nhưng vì một phụ thuộc của thư viện, module.modulemap không hoạt động, cocoapod là tự động tạo modulemap, nhưng nó dường như không hoạt động, bạn đã phải đối mặt với một cái gì đó tương tự?
Amadeu Cavalcante Filho

8

Nếu bạn cần điều này cho các mục tiêu của Cốc Cốc, hãy thêm dòng này vào 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 ModulesChỉ làm việc trong mã objc. không làm việc nhanh chóng

Sau một thời gian nghiên cứu, tôi thấy rằng swift có thể chuyển tham số cảnh báo sang tiếng kêu, do đó, thiết lập OTHER_SWIFT_FLAGSđể -Xcc -Wno-error=non-modular-include-in-framework-modulengăn chặn lỗi nhập nhanh.

chỉ dành cho người có cùng vấn đề


6

Tôi đã có cùng một vấn đề và không có gì từ trên giúp tôi. Vì vậy, tôi hy vọng câu trả lời của tôi sẽ hữu ích cho ai đó. Trong trường hợp của tôi, sự cố nằm ở cài đặt ALWAYS_SEARCH_USER_PATHS. Khi nó được đặt thành KHÔNG dự án được xây dựng và hoạt động tốt. Nhưng theo như một trong các nhóm yêu cầu thì nó phải được đặt thành CÓ Tôi đã nhận được một lỗi

Bao gồm tiêu đề không mô-đun bên trong mô-đun khung

Sau vài tách cà phê và cả ngày nghiên cứu, tôi phát hiện ra rằng theo các vấn đề đã biết của ghi chú phát hành Xcode 7.1 Beta 2 :

• Nếu bạn gặp lỗi thông báo "Bao gồm tiêu đề không mô-đun bên trong mô-đun khung" cho khung đã được biên dịch trước đó, hãy đảm bảo cài đặt xây dựng "Luôn tìm kiếm đường dẫn người dùng" được đặt thành "Không". Mặc định là "Có" chỉ vì lý do cũ. (22784786)

Tôi đã sử dụng XCode 7.3, nhưng có vẻ như lỗi này chưa được sửa.


6

vấn đề tương tự làm cho crazy.finally, tôi thấy đặt 'nhập xxx.h' trong triển khai thay vì giao diện có thể khắc phục vấn đề. Và nếu bạn sử dụng Cocoapods để quản lý dự án của mình. Bạn có thể thêm

s.user_target_xcconfig = {'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'CÓ'}

trong tệp 'xxx.podspec' của bạn.


6

Nếu bạn thấy lỗi này trong tiêu đề ô khi xây dựng khung động , hãy đảm bảo bạn nhập tệp của mình dưới dạng:

#import "MyFile.h"

không phải#import <MyFramework/MyFile.h>.


2

Tôi cũng đã gặp phải vấn đề này và ban đầu nghĩ rằng đó là sự cố của Cốc Cốc, nhưng đó là một vấn đề trong cài đặt xây dựng ứng dụng nơi ai đó (có thể là tôi) đã đặt ${PODS_ROOT}trong Đường dẫn tìm kiếm tiêu đề và đặt nó thành recursivetìm kiếm. Điều này đã cho phép nó tìm các tiêu đề không được sử dụng khi xây dựng ứng dụng. Một khi tôi thiết lập điều này để sử dụng non-recursivemọi thứ đều ổn. sử dụng recursivetìm kiếm là một hack khủng khiếp để cố gắng tìm các tiêu đề thích hợp. Bài học kinh nghiệm.


Tôi có thể xác nhận đây là vấn đề của tôi.
Wilson Muñoz

Tôi gặp vấn đề này với PersonalAdConsent và điều này đã khắc phục nó. Cảm ơn!
Steven Elliott

1

Đây là một vấn đề gây phiền nhiễu cho tôi. Không có đề xuất nào có thể giúp ích cho trường hợp cụ thể của tôi, vì tôi cần bao gồm các tiêu đề "không mô-đun" trong tệp tiêu đề tệp riêng lẻ của mình. Công việc xung quanh tôi đã sử dụng là dán lệnh gọi nhập trong tệp tiêu đề tiền tố.


0

Cuối cùng tôi đã chuyển Tiêu đề ô xuống cuối danh sách Tiêu đề sau khi kiểm tra các giải pháp trên và điều đó đã hoạt động trong Xcode 9.3.


0

Tôi đã giải quyết nó loại bỏ Modulesthư mục từ khung.

  • Duyệt đến vị trí khung của bạn có trong Dự án ứng dụng bằng công cụ tìm

  • Đi vào Test.frameworkthư mục bên trong (Trong trường hợp trên sẽ là CoreLibrary.framework) & Xóa Modulesthư mục.

  • Làm sạch và xây dựng lại ứng dụng, nó sẽ giải quyết vấn đề.


0

Trong trường hợp của tôi, tôi đã quên thêm tệp .h và .m trong phần "s.source_files" của tệp .podspecs.

Sau khi thêm nó vào nó hoạt động tốt.

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



-5

Tôi đã có thể xóa hàng tá các lỗi này bằng cách sử dụng Git sạch. Đây là lệnh: git clean -dffx && git reset --hard

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.