tệp được tạo cho kho lưu trữ không phải là kiến ​​trúc được liên kết (i386)


79

Tôi phải xây dựng thư viện tĩnh. Tôi muốn sử dụng trong ứng dụng iPhone và ipad của mình. Khi tôi cố gắng chạy trình mô phỏng, tôi nhận được lỗi liên kết. Tôi là người mới phát triển iOS. giúp đỡ một cách tử tế;

ld: warning: bỏ qua tệp /Users/valuelabs/Desktop/DruvaProject/libraries/libnetUtils.a, tệp được tạo cho kho lưu trữ không phải là kiến ​​trúc đang được liên kết (i386) Các ký hiệu không xác định cho kiến ​​trúc i386:
"_OBJC_CLASS _ $ _ netUtils", được tham chiếu từ : objc-class-ref trong ViewController.o ld: Symbol (s) not found for architecture i386 clang: error: lệnh linker bị lỗi với mã thoát 1 (sử dụng -v để xem lời gọi)

Tôi đã thử thêm i386 trong Kiến trúc. nhưng không có may mắn

Câu trả lời:


77

Sau khi vật lộn với cùng một vấn đề này và làm theo tất cả các câu trả lời được chấp nhận về việc cập nhật cài đặt bản dựng, xóa đường dẫn tìm kiếm trình liên kết, v.v. cuối cùng tôi đã tìm ra câu trả lời phù hợp với mình.

Trước khi xây dựng, hãy đảm bảo bạn chọn đúng loại (Trình mô phỏng iPhone) thay vì Thiết bị iOS. Sau đó xây dựng lại. Nếu không, bạn đang cố gắng sử dụng thư viện được xây dựng cho thiết bị iOS (bộ xử lý cánh tay) trên trình mô phỏng trên máy mac (i386) của bạn. Lẽ ra phải rõ ràng, nhưng không phải.

Trước:

Cài đặt thiết bị iOS

Sau:

Cài đặt trình mô phỏng iPhone 5.1

Bây giờ, hãy tìm trong nhóm Sản phẩm trong Bộ điều hướng> nhấp chuột phải vào thư viện tĩnh của bạn (tệp .a)> Hiển thị trong Trình tìm kiếm, bạn sẽ nhận thấy rằng nó nằm trong thư mục Debug-iphonesimulator thay vì Debug-iphoneos. Tôi đã không chú ý đến tên thư mục ban đầu, hoặc tôi có thể đã nghĩ đến điều này sớm hơn.

Hi vọng điêu nay co ich.


Điều này đã giải quyết nó cho tôi. Có nhiều cách để xây dựng một kiến ​​trúc mà bạn không có ý định và những người tìm kiếm trong tương lai có thể muốn xem qua nhiều câu trả lời trong số này để xem liệu bạn có tìm thấy câu trả lời phù hợp với mình không!
Danny

Cập nhật: Sau khi xcode 5 và trình mô phỏng iPhone 64-bit, tôi gặp lỗi với libPods.a đang được xây dựng cho một kiến ​​trúc khác, nhưng nó không xảy ra trong các loại trình mô phỏng khác: \
Nour1991

13
@ Nour1991 thiết lập thử Build Settings -> Build Active Architecture OnlyđểNo
MMiroslav

@MMiroslav Tôi đã phải đặt nó thành có, vì tôi cần triển khai trong gỡ lỗi.
Pedro Romão

42

Đôi khi những lỗi kiểu này làm bạn khó chịu!

Xóa dữ liệu có nguồn gốc hoạt động cho tôi:

Các bước sửa chữa

1) Trong XCODE> Windows> Dự án> Chọn dự án của bạn> Xóa dữ liệu có nguồn gốc> Thoát XCODE và mở lại nó> Nếu bạn gặp lỗi MAC-O-Linker tạo không thành công> Tham khảo liên kết này > Làm sạch và xây dựng lại.


1
Để xóa dữ liệu có nguồn gốc trong XCode 8, hãy xem tại đây: stackoverflow.com/questions/38016143/…
Dan Carlson

28

Của bạn libnetUtils.ađang được xây dựng cho một kiến ​​trúc khác với mục tiêu của bạn.

Kiểm tra cài đặt bản dựng libnetUtils. Các kiến ​​trúc mà nó đang được xây dựng và danh sách các kiến ​​trúc được hỗ trợ của nó phải là một tập hợp (yếu) của kiến ​​trúc mục tiêu của bạn. Sự phức tạp ở đây là kiến ​​trúc kết quả được trải rộng trên các cài đặt khác nhau: "Kiến trúc", "Chỉ xây dựng kiến ​​trúc đang hoạt động" và "Kiến trúc hợp lệ".

Cài đặt "Chỉ xây dựng kiến ​​trúc hoạt động" làm cho điều này đặc biệt khó hiểu. Ví dụ: giả sử bạn đang xây dựng trình mô phỏng. Nếu cài đặt "Chỉ xây dựng kiến ​​trúc hoạt động" cho Gỡ lỗi được đặt thành KHÔNG, nó sẽ xây dựng tất cả các kiến ​​trúc được liệt kê trong "Kiến trúc" và "Kiến trúc hợp lệ" (có thể là armv7, v.v.). Nhưng nếu libnetUtils có cài đặt đó được đặt thành Có (Gỡ lỗi: Có) thì nó chỉ đang xây dựng cho i386. Vì vậy, khi trình liên kết của bạn cố gắng liên kết armv7 với i386, nó không thành công.


26

Nếu tôi nhận được cảnh báo tệp bỏ qua - tôi sẽ chạy lipo -infotrên tệp bị bỏ qua để tìm kiến ​​trúc của nó như bên dưới

lipo -info libnetUtils.a

Điều đó sẽ in ra i386, armv6, armv7, armv7s, x86_64, v.v. Nói chung, kiến ​​trúc đó phải phù hợp với nền tảng xây dựng mục tiêu của bạn. Ví dụ

  • i386 = ios simulator hoặc bản dựng 32 bit trên mac os x
  • armv6 armv7 arm7s = thiết bị iOS
  • x86_64 = 64 bit xây dựng trên mac os x

Tùy thuộc vào sự không phù hợp, bạn phải xây dựng lại thư viện cho nền tảng mục tiêu của mình hoặc thay đổi nền tảng mục tiêu.

Lưu ý: Đối với mã nhị phân béo, lipo -infosẽ in kết hợp các kiến ​​trúc trên.


2
Mặc dù, điều này không trả lời OP. Đây là một công cụ tuyệt vời để gỡ lỗi vấn đề này. Điều tôi muốn biết là, làm thế nào để bạn xây dựng một hệ nhị phân với tất cả các kiến ​​trúc được đề cập ở trên?
Jay Q.

Đừng bận tâm, tôi đã tìm thấy câu trả lời ở đây: stackoverflow.com/questions/2793392/… sử dụng lipo để kết hợp các bản dựng bằng cách sử dụng cờ '-create'
Jay Q.

ld: warning: building for iOS-armv7 nhưng cố liên kết với tệp được xây dựng cho iOS-arm64 Các ký hiệu không xác định cho kiến ​​trúc armv7 cảnh báo này dẫn đến lệnh clang: error: linker bị lỗi với mã thoát 1 (sử dụng -v để xem lời gọi) lỗi này . Nếu bạn đang sử dụng thư viện / khuôn khổ riêng thì hãy thay đổi điều này trong cả Thư viện dự án cũng như Adopter. Cài đặt xây dựng -> Chỉ xây dựng kiến ​​trúc hoạt động để không
Shrikant Phadke


9

Tôi thực sự không biết lời khuyên của mình có đúng không, nhưng hãy thử kiểm tra điều này:

  • Chọn dự án của bạn
  • Chọn "Cài đặt bản dựng"
  • Kiểm tra kiến ​​trúc:
    • Kiến trúc hợp lệ phải là "armv6 armv7"
    • Nền tảng được hỗ trợ phải là "iphonesimulator iphoneos" (có thể là iPad, tôi không biết)
    • SDK cơ sở - SDK iOS của bạn (tôi có iOS 5.0).

Đừng đánh giá tôi nếu tôi là đội trưởng rõ ràng :)


17
Ngoài lời khuyên của Alexander, tôi khuyên bạn nên đảm bảo rằng cài đặt 'Chỉ xây dựng kiến ​​trúc hoạt động' được đặt thành 'KHÔNG'. Điều này đã làm tôi vấp ngã gần đây.
TPoschel

5

Điều đó có nghĩa là thư viện bạn đang cố gắng sử dụng không được biên dịch chung cho trình mô phỏng iOS (các ký hiệu i386 dành cho Mac). Mặc dù vậy, chạy nó trên một thiết bị thực tế sẽ hoạt động tốt.


3

Gặp vấn đề tương tự và đã thử các giải pháp khác nhau từ trang nhưng không có kết quả. Tôi vẫn có một thông báo cho tôi biết thư viện của tôi không được xây dựng cho arm64.

Cuối cùng tôi đã giải quyết nó như thế nào:

  • đã mở project.pbxproj cho thư viện trong trình soạn thảo văn bản
  • đã tìm kiếm VALID_ARCHS
  • có 4 lần xuất hiện, trong đó 2 lần không chứa arm64
  • Tôi đã thêm arm64 vào chuỗi theo cách thủ công (VALID_ARCHS = "arm64 i386 armv7 armv7s")
  • xây dựng lại lib và nó đã ổn

Có vẻ như đôi khi cài đặt bản dựng do XCode hiển thị không hoàn chỉnh và không tương ứng chính xác với tệp dự án.


3

Bạn cũng nên kiểm tra xem Mục tiêu triển khai trong Cài đặt bản dựng có giống nhau đối với phụ thuộc và phụ thuộc hay không. Tôi nhận thấy rằng tôi đã đặt iOS 13 cho mục tiêu thư viện tĩnh, trong khi iOS 10.0 được xác định cho khung sử dụng thư viện đó. Switchin cả hai đến 10.0 đã giải quyết vấn đề.


Kiểm tra tất cả những đề nghị khác về vấn đề này, đây là một trong những vấp tôi lên
Richy

0

Đối với tôi, nó đã được cố định đặt Build Active Architecture Onlythành Multiple values, để làm điều đó, bạn phải mở rộng nó và đặt Debugthành YESReleaseđến No. Và bây giờ, nó biên dịch trên thiết bị của tôi.


-1

Sự cố này sẽ không xảy ra khi chúng tôi chạy ứng dụng trên thiết bị. Bạn có thể kiểm tra nó bằng cách chạy mã trên thiết bị iOS.


-2

Tôi cũng có một kiến ​​trúc của armv7s. Tôi đã xóa nó và đảm bảo rằng armv6 và armv7 là hai cái duy nhất được liệt kê. Nó hoạt dộng bây giờ


Bạn không nên loại trừ armv7s
Maciej Swic
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.