Câu hỏi Xcode 6.1: tệp được xây dựng cho x86_64 không phải là kiến ​​trúc được liên kết (i386)


Tôi đã tạo một dự án khung công tác Swift cho các tiện ích / phần mở rộng biên dịch và sao chép .framework vào một vị trí chuyên dụng trên hệ thống của tôi. Tôi muốn để có thể bao gồm tập tin này vào các dự án khác (Build Phases / Link Binary with Libraries). Dự án khung là dự án kiểu khung cảm ứng Cocoa (được chọn từ trình duyệt mẫu dự án Xcode 6.1).

Nhưng khi tôi cố gắng biên dịch một dự án liên kết tệp khung công tác, tôi nhận được cảnh báo này:

ld: cảnh báo: bỏ qua tệp   /Users/name/Projects/Xcode/Libs/swiftutils.framework/swiftutils, tệp   được xây dựng cho x86_64 không phải là kiến ​​trúc được liên kết   (i386):   /Users/name/Projects/Xcode/Libs/swiftutils.framework/swiftutils

Tôi có thể làm gì với dự án khung để nó có giá trị cho các dự án iOS khác không? Nó gây nhầm lẫn bởi vì dự án khung là một dự án khung cảm ứng ca cao mà tự nhiên nên làm việc với các dự án Cocoa Touch (tức là IOS), phải không?


33
2017-11-21 07:11


gốc




Các câu trả lời:


Hãy chắc chắn rằng bạn có i386 và x86_64 được liệt kê trong Kiến trúc của bạn trong cài đặt Xây dựng cho lib của bạn. Cũng được đặt Chỉ xây dựng kiến ​​trúc hoạt động rõ ràng Không.


28
2017-11-21 07:26



Điều đó một mình dường như không đủ. Tôi đã thêm chúng để Kiến trúc hợp lệ đọc như thế này: arm64 armv7 armv7s i386 x86_6 ... Vẫn gặp lỗi tương tự. - BadmintonCat
Ok, tôi là một bước xa hơn ... Tôi đã thiết lập Build Active Architecture Chỉ rõ ràng là NO vì nó chứa các giá trị hỗn hợp để gỡ lỗi và phát hành. Tuy nhiên, cảnh báo đã biến mất: API khung của tôi không được tìm thấy trong dự án ứng dụng. Có vẻ như các lớp khung không được liên kết nên tôi không nhận được gợi ý tự động hoàn chỉnh cho API khung công tác và việc biên dịch không thành công. Điều gì có thể sai? - BadmintonCat
Bạn có thể có các cài đặt khác nhau để gỡ lỗi và phát hành, có thể không? - dogsgod
Xây dựng Kiến trúc Hoạt động Chỉ rõ ràng là Không làm việc cho tôi. Cảm ơn bạn đời. - ZaEeM ZaFaR


Tôi đã gặp sự cố này và giải pháp hiện tại đã loại bỏ lỗi ban đầu (tức là không thể liên kết i386), nhưng sau đó các Khung được liên kết (chẳng hạn như Alamofire) không thể được nhập vào dự án của tôi. Giải pháp sau khắc phục sự cố này.

  1. Trong mục tiêu của bạn Build Settings -> Architectures -> Valid Architectures, thêm giá trị i386.

build settings

  1. Tiếp theo, xóa nội dung trong thư mục dữ liệu có nguồn gốc của dự án của bạn. Nội dung của thư mục này được tạo trong thời gian xây dựng và có thể được xóa một cách an toàn và Xcode sẽ tạo một thư mục mới. Để xóa thư mục này trong Xcode 8, hãy truy cập File->Project/Workspace Settings, nhấp vào mũi tên màu xám để mở vị trí thư mục trong Trình tìm kiếm và xóa nội dung. derived data folder location

  2. Làm sạch và xây dựng lại.

  3. Nếu quá trình xây dựng vẫn không thành công, hãy kiểm tra trình điều hướng sự cố cho điều gì đó có nội dung Update to recommended settings. Nhấp vào nó và thử lại.
    Nếu bạn không thấy tùy chọn đó, hãy thay đổi Build Active Architecture Only đến Yes trong cài đặt bản dựng. Điều này làm chậm thời gian xây dựng có thể gây phiền toái khi chuyển đổi giữa các thiết bị khác nhau thường xuyên, tuy nhiên nó có thể là cần thiết.


7
2017-09-02 23:34



Nó làm việc cho tôi. Tôi đang sử dụng Xcode 7.0.1. Cảm ơn bạn!! - lgm
thú vị, tôi đã có nó bằng tay thiết lập để NO trước và nó được sử dụng để làm việc. cập nhật lên nhanh chóng 3 và nó đã phá vỡ. hoàn nguyên về YES và mọi thứ vẫn ổn. đi con số .. - joe
"Kiến trúc hợp lệ" ở đâu trong XCode 8? - Maiaux
@Maiaux Nó vẫn còn trong cài đặt xây dựng. Nếu bạn nhìn vào hình ảnh đầu tiên tôi có trong câu trả lời này, bạn sẽ nhận thấy có một thanh tìm kiếm. Kiểu valid trong đó và Valid Architectures sẽ hiển thị. Ngoài ra hãy chắc chắn rằng bạn có All nút được chọn. nếu Basic được chọn nó có thể không hiển thị trong kết quả tìm kiếm. - darksinge
@darksinge Tôi đã nhận được cùng một lỗi và tôi theo bước của bạn nó làm việc cho tôi trong khi tôi chạy mã trong giả lập. Nhưng khi tôi cố gắng chạy mã trong thiết bị có lỗi "bỏ qua fil .., tập tin được xây dựng cho x86_64 mà không phải là kiến ​​trúc được liên kết (arm64):" sau đó tôi theo cùng bước với arm64 nhưng lỗi vẫn tồn tại. - reetu


Trong khi câu trả lời được chấp nhận đã giải quyết được vấn đề, đây là một chút nữa vì vấn đề là về kiến ​​trúc, theo nghĩa đen là các tệp nhị phân

1. Kiến trúc trong iOS

armv64: iPhoneX, iPhone 5s-8, iPad Air - iPad Pro

armv7: iPhone3Gs-5c, iPad WIFI (thế hệ thứ 4)

armv6: iPhone - iPhone3G

ở trên nếu cho các thiết bị thực

i386: Trình mô phỏng 32 bit

x86_64: Trình mô phỏng 64 bit

danh sách trên là tương thích xuống, có nghĩa là iPhoneX có thể chạy với armv6 là tốt, và chỉ có thể không hoàn toàn sử dụng các chức năng của armv64

bạn có thể tìm thêm thông tin về kiến ​​trúc iOS tại đây: https://developer.apple.com/library/content/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/DeviceCompatibilityMatrix/DeviceCompatibilityMatrix.html

2. Chỉ xây dựng kiến ​​trúc hoạt động là gì?

Nếu được chọn "Có", nó sẽ chỉ xây dựng khung của bạn cho "thiết bị được chọn", thiết bị thực (armv) hoặc trình mô phỏng (x86_64 hoặc i386). Đối với "Không", nó sẽ xây dựng khung công tác của bạn vào danh sách "Kiến trúc hợp lệ" của bạn

Theo mặc định, trong chế độ gỡ lỗi, nó là "Có"; và trong bản phát hành nhiều hơn, nó là "Không", có thể tiết kiệm thời gian biên dịch trong chế độ gỡ lỗi và đảm bảo khung dự án phát hành của bạn chạy trên tất cả các kiến ​​trúc mà bạn đã chỉ định.

Đó là lý do tại sao câu trả lời được chấp nhận làm việc bằng cách buộc khuôn khổ xây dựng cho tất cả các kiến ​​trúc, tuy nhiên bằng cách đọc thêm, bạn sẽ biết những gì đằng sau và có thể tiết kiệm thời gian trong việc biên dịch khuôn khổ của bạn. Tất nhiên, kiểm soát nhiều hơn trong chính mình là tốt.

Vì vậy, nếu bạn đang làm việc trên một khuôn khổ và muốn nhập vào một dự án khác, nếu bạn biên dịch khuôn khổ với Chỉ xây dựng kiến ​​trúc hoạt động "Có" với trình mô phỏng (i386 hoặc x86_64)và sau đó nhập vào dự án của bạn Chỉ xây dựng kiến ​​trúc hoạt động "Có" với một thiết bị thực (armv), bạn sẽ gặp phải lỗi này.

Nhìn vào mô tả lỗi:

tệp được tạo cho x86_64 mà không phải là kiến ​​trúc được liên kết (i386) sẽ ngụ ý bạn xây dựng khung công tác của bạn trong trình mô phỏng 64 bit và xây dựng dự án đã hợp nhất của bạn với trình mô phỏng 32 bit.

trong khi phổ biến hơn sẽ là:

tệp khung được xây dựng cho x86_64 đó không phải là kiến ​​trúc   được liên kết (arm64):   ngụ ý khung của bạn được xây dựng trong trình mô phỏng trong khi dự án hợp nhất của bạn được tạo bằng thiết bị thực.

3. Trích xuất khung công tác

Một thực tế phổ biến sẽ là kích chuột phải vào khung công tác và chọn Hiển thị trong Trình tìm kiếm, trong khi hầu hết các nhà phát triển giữ Trình tìm kiếm mở và khung được biên dịch mới sẽ thay thế khung cũ mà không cần đóng Trình tìm kiếm và mở lại lần nữa. Đúng, nhưng nếu bạn chuyển thiết bị mục tiêu xây dựng ở giữa, các khung công tác sẽ dẫn đến các thư mục khác nhau. Đôi khi bạn nghĩ rằng bạn đã biên dịch khuôn khổ của mình nhưng thực sự nó nằm trong một thư mục khác. Đề xuất của tôi sẽ luôn được chọn Hiển thị trong Trình tìm kiếm để ngăn khuôn khổ bạn nhập không phải là khung mới nhất.

Hai thư mục khác nhau: Debug-iphoneos và Debug-iphonesimulator enter image description hereenter image description here


4
2018-03-07 04:18



Dude! điểm thứ 3 của bạn 3. Extracting the framework là vàng đặc. Tôi gần như ngã khỏi ghế khi tôi gặp phải lỗi này. Nhưng sau bước thứ ba để trích xuất khung chính xác là cách tiếp cận đúng, Câu trả lời được chấp nhận là khá đáng sợ. - Annjawn
Khung trong dự án ban đầu của nó phải được biên dịch và xây dựng một lần ở cấp độ / thiết bị os mà dự án đang nhắm mục tiêu và cũng trong mô phỏng. Kết quả .framework các tệp sau đó cần được chọn từ thư mục chính xác như trong bước thứ 3 để nhập vào dự án mới. - Annjawn


Tôi cũng thấy rằng nếu bạn đang sử dụng các khuôn khổ thông qua các tổ chức cocoapod như tôi, tôi phải đi đến dự án Pods, và áp dụng các giải pháp của @dogsgod và @darksinge cho mọi mục tiêu khung trong dự án Pods. Đó là, tôi phải tắt xây dựng cho các kiến ​​trúc hoạt động chỉ và thêm X86_64 và i386 vào các kiến ​​trúc hợp lệ.


1
2018-04-12 21:19