Biểu tượng không xác định cho kiến ​​trúc armv7


307

Vấn đề này đã khiến tôi phát điên, và tôi không thể tìm ra cách khắc phục ...

    Undefined symbols for architecture armv7:
  "_deflateEnd", referenced from:
      -[ASIDataCompressor closeStream] in ASIDataCompressor.o
  "_OBJC_CLASS_$_ASIDataDecompressor", referenced from:
      objc-class-ref in ASIHTTPRequest.o
  "_deflate", referenced from:
      -[ASIDataCompressor compressBytes:length:error:shouldFinish:] in ASIDataCompressor.o
  "_deflateInit2_", referenced from:
      -[ASIDataCompressor setupStream] in ASIDataCompressor.o
ld: symbol(s) not found for architecture armv7
collect2: ld returned 1 exit status
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1

Tôi nghĩ rằng nó phải làm với:

ld: symbol(s) not found for architecture armv7

Nhưng tôi đã thêm: libz.1.2.3.dylibvà nó không giúp được gì, có ai có ý kiến ​​gì không?


Một khả năng khác không có trong bất kỳ câu trả lời hiện có nào là bạn có thể đang sử dụng -ObjCcờ liên kết khác và vì vậy Obj-C từ các thư viện tĩnh bên ngoài mà bạn đang sử dụng không nên nhìn thấy (như từ Parse), có thể nhìn thấy được. Xem câu trả lời của tôi nếu đây là trường hợp: stackoverflow.com/a/26151208/901641
ArtOfWarfare

2
Theo nguyên tắc thông thường, đôi khi XCode đưa ra các loại lỗi như Match-O và không tìm thấy biểu tượng cho kiến ​​trúc i386 (hoặc khác) khi các tệp không được thêm vào dự án. Bạn có thể nhấp chuột phải vào thư mục dự án và thực hiện "Thêm tệp vào <dự án>".
Fabricio PH

Bạn thực sự có thể thấy các ký hiệu cụ thể được tạo bằng công cụ nm. Di chuyển đến đường dẫn của tệp .o và chạy nm -gtrên tệp đang gọi biểu tượng và biểu tượng cần có ký hiệu và bạn nên xem liệu chúng có khớp với nhau hay không, có thể cung cấp manh mối cho lỗi. tập tin nm -g.o Bạn có thể kiểm tra các ký hiệu C ++ được giải mã bằng cách này: tập tin nm -gC.o
james_alvarez

Ai đó có thể xin vui lòng giúp tôi? Tôi nhận được lỗi dưới đây nhưng không có giải pháp nào ở trên phù hợp với tôi. Tôi đã dành nhiều ngày với tất cả các cài đặt có thể. Undefined symbols for architecture armv7: "YGConfig::YGConfig(int (*)(YGConfig*, YGNode*, YGLogLevel, char const*, void*))", referenced from: _YGConfigNew in libyoga.a(Yoga.o) ld: symbol(s) not found for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation)
quỷ đỏ

Câu trả lời:


506

Nguyên nhân phổ biến

Các nguyên nhân phổ biến cho "Biểu tượng không xác định cho kiến ​​trúc armv7" là:

  1. Bạn nhập một tiêu đề và không liên kết với thư viện chính xác . Điều này là phổ biến, đặc biệt đối với các tiêu đề cho các thư viện như QuartzCore vì nó không được bao gồm trong các dự án theo mặc định. Để giải quyết:

    • Thêm các thư viện chính xác trong Link Binary With Librariesphần của Build Phases.

    • Nếu bạn muốn thêm một thư viện bên ngoài đường dẫn tìm kiếm mặc định, bạn có thể bao gồm đường dẫn trong Library Search Pathsgiá trị trong Cài đặt bản dựng và thêm
      -l{library_name_without_lib_and_suffix}(ví dụ: để sử dụng libz.a -lz) vào Other Linker Flagsphần của Build Settings.

  2. Bạn sao chép các tập tin vào dự án của bạn nhưng quên kiểm tra mục tiêu để thêm các tập tin vào . Để giải quyết:

    • Mở Build Phasesmục tiêu chính xác, mở rộng Compile Sourcesvà thêm các .mtệp bị thiếu . Nếu đây là vấn đề của bạn, vui lòng nâng cấp câu trả lời của Cortex bên dưới .

  3. Bạn bao gồm một thư viện tĩnh được xây dựng cho một kiến ​​trúc khác như i386, trình giả lập trên máy chủ của bạn. Để giải quyết:

    • Nếu bạn có nhiều tệp thư viện từ nhà cung cấp thư viện để đưa vào dự án, bạn cần bao gồm tệp cho trình giả lập (i386) và tệp cho thiết bị (ví dụ armv7).

    • Tùy chọn, bạn có thể tạo một thư viện tĩnh chất béo chứa cả kiến ​​trúc.



Câu trả lời gốc:

Bạn đã không liên kết với các tập tin libz chính xác. Nếu bạn nhấp chuột phải vào tệp và tiết lộ trong công cụ tìm, đường dẫn của nó sẽ ở đâu đó trong thư mục sdk của iOS. Đây là của tôi chẳng hạn

/Developer/Plevelops/iPhoneOS.pl platform / Developer / SNKs / iPhoneOS4.3.sdk / usr / lib

Tôi khuyên bạn nên xóa tham chiếu và sau đó thêm lại nó trong phần Liên kết nhị phân với thư viện Xây dựng các giai đoạn của mục tiêu của bạn.


4
Cũng có thể là do bạn cần thêm từ "-licucore" trong cài đặt dự án / Cờ liên kết khác. Nó được thêm tự động cho bản dựng gỡ lỗi của tôi nhưng không phải là bản phát hành nên sẽ không biên dịch.
JulianB

4
Tôi gặp vấn đề tương tự. Không thực sự đọc đúng các ghi chú cài đặt nên đã không nhận thấy rằng phiên bản mới của bugense cần nhị phân libz được thêm vào trong các giai đoạn xây dựng.
Max MacLeod

2
Bạn có chắc chắn rằng bạn đã bao gồm phần @im THỰC HÀNH trong tệp .m tương ứng của mình cho tất cả các lớp bạn đã khai báo trong tệp tiêu đề của mình không?
chém

7
Tôi chỉ muốn thêm Tôi nghĩ rằng bạn thật sự tôn trọng bạn khi tham khảo một câu trả lời khác cho câu hỏi này và bảo chúng tôi bỏ phiếu nếu điều đó có ích.
Andrew

Cảm ơn vì sự giúp đỡ! :) Đối với tôi đã giúp gõ rõ ràng trong phần Cờ liên kết khác : -framework <FrameWorkName>. Tôi gặp vấn đề với XCTest, vì vậy tôi phải thêm -framework XCTest. Cảm ơn! :)
piotr_ch

198

Tôi đã có một vấn đề tương tự đêm qua và vấn đề này, có liên quan đến thực tế là tôi đã kéo một lớp từ Finder vào dự án của tôi trong Xcode.

Giải pháp là vào tab Build Ph Phase và sau đó là Compile Source và đảm bảo bạn kéo lớp vào danh sách.


6
Tôi ước tôi đã nhận ra đây là câu trả lời mà tôi đang tìm kiếm trước đó - Ngoài ra, bạn có thể chắc chắn kiểm tra 'Thêm vào mục tiêu' khi sao chép các lớp.
T. Markle

1
Whoa ... rất vui vì việc sửa chữa dễ dàng như vậy! Để rõ ràng, nếu bạn thêm một lớp bằng cách kéo từ công cụ tìm vào dự án của bạn, XCode không luôn luôn thêm chúng vào danh sách các giai đoạn xây dựng của bạn. Tôi chỉ cần nhấn nút "+" trong "Nguồn biên dịch" trong các giai đoạn xây dựng, thêm tất cả các tệp vi phạm và nó được biên dịch ngay lập tức.
A-mốt

1
Ồ Apple thực sự cần xem xét lại các thông báo lỗi của họ.
devios1 15/03/13

2
Một cách khác để khắc phục điều này là chọn tệp bị thiếu. và mở thanh trượt "Tiện ích". (Đó là cái bên phải) Và chọn "Trình kiểm tra tệp". Sau đó, đảm bảo có một kiểm tra trong dự án trong "Thành viên mục tiêu". Tôi đang sử dụng Xcode 4.6.2
zingle-dingle

1
Tôi không biết tệp nào bị thiếu, vì vậy tôi đã hiển thị Giai đoạn xây dựng trong trình chỉnh sửa trợ lý (chế độ xem chỉnh sửa thứ hai). Tôi đã mở tệp vi phạm trong chế độ xem chỉnh sửa bên trái và kiểm tra xem từng tệp đã nhập tồn tại trong Giai đoạn xây dựng. Tôi đã thêm một cái không và nó đã được giải quyết.
Dan Sandland

38

Tôi gặp vấn đề tương tự và tôi phải kiểm tra "Chỉ xây dựng kiến ​​trúc hoạt động" trên từng cấu hình Dự án (Gỡ lỗi, Phát hành và Triển khai) và trong Cài đặt bản dựng của mục tiêu.


3
Cũng đã lừa tôi. Đã chỉ cần trong dự án chính mặc dù.
Kirualex

4
Tôi gặp những vấn đề tương tự. Các Build Active Architecture Onlythiết lập là khác nhau giữa Podsvà dự án của tôi. Ở giai đoạn liên kết, nó đã thất bại.
AechoLiu


14

Tôi đã có một vấn đề tương tự với điều đó. Tên lớp sau _OBJC_CLASS _ $ _ thực ra là lớp của tôi. Lý do là tôi đã không đánh dấu "Thêm vào mục tiêu" khi tôi kéo các tệp mã nguồn vào danh sách điều hướng.

Giải pháp của tôi là:

  1. xóa lớp khỏi danh sách điều hướng và chọn "chỉ xóa tham chiếu"

  2. kéo lại các tệp mã nguồn và đảm bảo hộp đánh dấu cho "thêm vào mục tiêu" được đánh dấu. Hộp đánh dấu nằm ngay dưới "Sao chép nếu cần" và "Tạo nhóm".


Chỉ cần thêm: mặc dù đây không phải là NGUYÊN NHÂN XÁC NHẬN NHẤT của lỗi, tôi chỉ là câu trả lời của bạn (không đánh dấu vào ô) xảy ra với tôi bây giờ.
Adam

8

Thường có một bí danh không có mã định danh phiên bản được liên kết với phiên bản hiện tại, trong trường hợp này libz.dylib được liên kết với libz.1.2.5.dylib. Sử dụng bí danh cơ sở thay vì phiên bản.


5

Trong Mục tiêu -> Cài đặt bản dựng -> Ngôn ngữ trình biên dịch Apple LLVM: cài đặt 'Phương ngữ ngôn ngữ C ++' và 'Thư viện chuẩn C ++' thành Trình biên dịch mặc định đã giúp giải quyết nó.


5

Tôi chỉ thêm libz.1.2.5.dylib vào dự án của mình và nó hoạt động như một cơ duyên.

Các bước -

  1. Chuyển đến giai đoạn xây dựng.
  2. Liên kết nhị phân với thư viện - sử dụng nút '+' để chọn khung và thư viện để thêm.
  3. Chọn libz.1.2.5.dylib từ danh sách.
  4. Xây dựng và chạy.

5

Tôi gặp vấn đề tương tự và thấy các lỗi liên quan đến "std ::"

Tôi đã thay đổi Cài đặt bản dựng -> Apple LVM 5.0 - Ngôn ngữ C ++ -> Thư viện chuẩn C ++

từ libc ++ (Thư viện chuẩn LLVM C ++ có hỗ trợ C ++ 11) đến libstdc ++ (Thư viện chuẩn GNU C ++)


5

Tôi gặp vấn đề tương tự khi tôi sử dụng thư viện admob, tôi đã sửa nó thay đổi "Architectures" thành "Standard architectures armv7, armv7s" mà không bao gồm 64 bit. Xây dựng cài đặt


4

Tôi có nhiều @interfaces trong tệp .h và chưa bao gồm tất cả các chỉ thị @im THỰCation tương ứng. Hãy chắc chắn rằng tất cả chúng đều cân bằng.


4

Nếu bạn có cờ -ObjCtrong Mục tiêu> Cài đặt bản dựng> Cờ liên kết khác và bạn đang gặp vấn đề này, hãy xem xét xóa nó. Nếu bạn cố tình thêm nó bởi vì bạn cần tải một số mã Obj-C từ một thư viện tĩnh thường không được tải nếu không, IE, một danh mục Obj-C, thì bạn nên sử dụng -force_load <path>thay vì -ObjC.

<path>nên liên quan đến thư mục dự án Xcode của bạn. IE, nếu cấu trúc thư mục của bạn trông như thế này:

iOSProject
  + iOSAPI.framework
      + iOSAPI
  + iOSAPI.xcodeproj

Sau đó, bạn nên đặt cờ này cho Other Linker Flags:

-force_load iOSAPI.framework/iOSAPI

Nếu bạn muốn bao gồm nhiều thư viện như vậy, thì bạn nên bao gồm một -force_loaddòng riêng cho mỗi thư viện .

-force_load iOSAPI.framework/iOSAPI
-force_load another.framework/another

4

Đây là cách tôi gặp vấn đề này:

Tôi đã thêm một .h, .m và NIB từ một dự án khác bằng cách kéo chúng vào trình điều hướng dự án của tôi. Xcode đã không thêm chúng vào Pha xây dựng đúng cách.

Kiểm tra câu trả lời của tôi vì tôi có một vấn đề tương tự mà tôi có thể giải quyết bằng cách thực hiện một số bước.


3

nếu bạn đang xử lý nâng cấp iOS5, tôi thấy rằng để biên dịch một dự án được viết cho mục tiêu 4.3, tôi có thể đổi tên libz.1.2.3.dynlib trong Project Navigator thành libz.1.2.5.dynlib và nó đã được biên dịch.

Thư mục iPhoneOS50SDK / usr / lib của tôi không có libz.1.2.3.dynlib - không biết đó là bản beta hay chỉ là nâng cấp tự nhiên.


3

Chuyển đến dự án của bạn, nhấp vào Xây dựng các giai đoạn, Biên dịch nguồn, Thêm GameCenterManager.m vào danh sách.


3

Có lẽ một số lớp bị thiếu khỏi mục tiêu của bạn. Điều này thường xảy ra khi bạn đổi tên / xóa / thêm các tệp lớp mới vào dự án của bạn. Để sửa lỗi thêm các lớp mới được thêm vào một số mục tiêu.

Chọn lớp trong Trình điều hướng dự án (thanh bên phải), mở thanh bên Tiện ích (thanh bên phải), từ Tiện ích chọn Trình kiểm tra tệp (biểu tượng giống như tệp), trong tab Thành viên mục tiêu đánh dấu mục tiêu của bạn. Đây là tất cả để tránh "Xóa tham chiếu" và thêm lại bằng thủ thuật "Thêm vào mục tiêu".

Vì vậy: Chọn Lớp -> Tiện ích (Trình kiểm tra tệp) -> Thành viên mục tiêu -> Đánh dấu các mục tiêu bạn muốn.


2

Tôi không tìm thấy đề xuất này ở đây nên nó xuất hiện: nếu dự án của bạn có nhiều mục tiêu (nghĩa là một cho OSX và một cho iOS) thì bạn phải liên kết các thư viện có liên quan cho từng mục tiêu .. ví dụ như trong trường hợp của tôi cần AudioToolbox .. Tôi phải thêm một lần cho OSX và một lần cho iOS (trong thư mục khung , bạn phải có một bản sao của mỗi thư viện cho mỗi mục tiêu .. nếu bạn chỉ thấy một .. thì đó là cờ đỏ)


Câu trả lời này đã giúp tôi. Tuy nhiên, tình huống của tôi thậm chí còn thẳng hơn ... Tôi chỉ đơn giản là quên thêm một khung công tác mà cơ sở mã của tôi đã tham chiếu. Trong trường hợp của tôi, tôi không thể tải AVFoundation.framework.
John Erck

Đúng, tôi chỉ đơn giản là quên thêm một khung trong giai đoạn "Liên kết nhị phân với thư viện".
Tối đa

2

Tôi đã phải đối mặt với một vấn đề với các thư viện PJSIP,

Đã thử các điều sau trong các cờ liên kết khác trong dự án và có thể khắc phục lỗi: -framework Foundation -framework UIKit

Các cờ liên kết ở trên được sử dụng trong Dự án Siphone qua github . Các cài đặt này sẽ giúp bạn giải quyết các vấn đề liên quan đến liên kết các thư viện C ++.


Tôi đang gặp vấn đề tương tự với librabries của PJSIP, bạn có thể giải thích chi tiết về giải pháp này không
Rajat Jain

Đặt các giá trị sau trong các cờ liên kết khác của cài đặt xây dựng dự án:
-framework Foundation -framework

Thông báo lỗi: bỏ qua tệp /Users/user/Doads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a, tệp được tạo để lưu trữ không phải là kiến ​​trúc được liên kết (i386): / Users /user/Doads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a Các biểu tượng không xác định cho kiến ​​trúc i386: "_pjsip_register_method", được tham chiếu từ:
Rajat Jain

Có vẻ như bạn đang cố chạy ứng dụng trên trình giả lập và libyuv.a không được xây dựng cho kiến ​​trúc giả lập i386. hãy thử chạy ứng dụng trên thiết bị trực tiếp
Adeesh Jain 14/03/18

Tôi muốn tích hợp Pjsip trong Swift. Tôi đã thử tạo các tiêu đề bắc cầu nhưng nó không hoạt động. Bạn có thể cho tôi một số ý tưởng?
Rajat Jain

1

Cuối cùng tôi cũng đã hiểu ra, tôi đã giải quyết vấn đề này bằng cách thêm khung vắng mặt vào mục tiêu-> Xây dựng giai đoạn-> Liên kết nhị phân với thư viện


1

Tôi đã từng có vấn đề này. Tôi nhận ra rằng trong khi di chuyển một lớp, tôi đã ghi đè lên .mmtệp với .htệp trên thư mục đích.

Khắc phục sự cố đó đã sửa lỗi.


1

Tôi đã nhận được lỗi 'Biểu tượng không xác định cho kiến ​​trúc armv7:' khi cố gắng biên dịch dự án có cài đặt xây dựng mục tiêu cho 'Thư viện chuẩn C ++' được đặt thành 'libc ++' (cần thiết vì dự án đang sử dụng một số tính năng từ C ++ 11) và dự án bao gồm một dự án con có cùng cài đặt được đặt thành 'libstdc ++' (hoặc mặc định của trình biên dịch như hiện tại).

Việc thay đổi cài đặt 'Thư viện chuẩn C ++ của dự án phụ thành libc ++ đã sửa nó, nhưng chỉ sau lần đầu tiên đặt mục tiêu triển khai cho dự án phụ thành 5.0 trở lên (5.0 là cần thiết cho libc ++).


1

Tôi cung cấp cho bạn nhiều đề xuất hơn mà bạn có thể kiểm tra khi các đề xuất phổ biến khác không có ích.

Nếu bạn liên kết với dự án khác (libxxx.a) đôi khi bạn có thể gặp vấn đề lạ mà bạn có thể tìm thấy biểu tượng bằng các công cụ như nm nhưng họ không thể tìm thấy các biểu tượng trong ld. Sau đó, bạn nên kiểm tra xem hai dự án được xây dựng trong cùng một cờ, một số trong số chúng có thể ảnh hưởng đến định dạng nhị phân.

  1. kiểm tra trình biên dịch c ++.
  2. kiểm tra cài đặt phương ngữ c ++.
  3. kiểm tra hỗ trợ loại thời gian chạy c ++. (-frtti / -fnortti)
  4. kiểm tra xem có .a có cùng tên xuất hiện ở nơi khác không, có thể nằm ngoài tệp mong muốn trong danh sách đường dẫn liên kết. loại bỏ chúng

1

Tôi gặp vấn đề này khi chạy ứng dụng trên iphone5s , nó đã được giải quyết bằng cách thêm arm64 vào Architectures .


1

Tôi đã từng gặp vấn đề tương tự. Tôi đã thử mọi thứ từ danh sách câu trả lời khổng lồ nhưng cuối cùng, vấn đề của tôi là: Tôi đang làm việc với openCV nên tôi cần kết hợp mã C ++ trong mã của mình. Để làm điều này, bạn nên thay đổi các tệp sử dụng object-c và C ++ thành .mm Tôi đã không thay đổi một tệp và tệp này không có kết nối với mã C ++ nhưng tôi phải thay đổi nó.


1

Tôi đã có vấn đề này, khi cài đặt shareKit. Nó hoạt động trong trình giả lập, nhưng không phải trên thiết bị. Tôi đã xóa -all_load khỏi Cờ liên kết khác và mọi thứ đều hoạt động tốt trong cả thiết bị giả lập và thiết bị iphone.


1

Trong trường hợp của tôi, tôi đã thêm một khung công tác phải sử dụng Objective C ++. Tôi tìm thấy bài này:

XCode .m so với .mm

đã giải thích cách main.m cần được đổi tên thành main.mm để các lớp Objective-C ++ cũng có thể được biên dịch.

Điều đó đã sửa nó cho tôi.


1

Tôi sử dụng để đối mặt với vấn đề đó khi mô-đun (tệp .m) không nằm trong mục tiêu mà tôi đang làm việc.


1

Đối với tôi, vấn đề là tôi quên đặt giá trị cho các hằng số của mình trong .m (triển khai)

file const kFooKey = @"Foo";

1

Tôi cũng đã thêm các tập tin thông qua Kéo và Thả. Những gì tôi đã làm, tôi đã xóa các tham chiếu của tất cả các tệp (Không bao gồm frameworks) sau đó thêm lại chúng đúng cách thông qua tùy chọn Thêm tệp vào dự án , vấn đề không còn nữa.


1

Nếu bạn đang xây dựng từ Unity3D 5 và cũng đang sử dụng plugin Prime31 và bạn đang gặp phải lỗi này thì đó có thể là do một bản sao. Nếu bạn xem qua các cảnh báo của mình trong trình soạn thảo của Unity, một trong số họ sẽ cho bạn biết điều này và cảnh báo rằng nó có thể gây ra lỗi xây dựng. Để xem đây có phải là trường hợp không, hãy nhập P31 vào trường tìm kiếm dự án của bạn và nó sẽ bật lên ngay cả, thậm chí có thể nhiều hơn một. Các bản sao sẽ có '1' ở cuối tên tệp. Điều này có thể được gây ra từ việc cập nhật plugin trong trình chỉnh sửa thông qua cửa hàng hoặc tab menu Prime31.

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.