Lỗi xây dựng Xcode Các biểu tượng không xác định cho kiến ​​trúc x86_64


168

Câu hỏi dành cho người mới bắt đầu Xcode:

Đây là trải nghiệm đầu tiên của tôi với Xcode 4.6.3.

Tôi đang cố gắng viết một chương trình điều khiển rất đơn giản, đó là tìm kiếm các thiết bị BT được ghép nối và in chúng ra NSLog.

Nó xây dựng với lỗi sau:

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_IOBluetoothDevice", referenced from:
      objc-class-ref in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Tôi tìm kiếm như điên. Vấn đề phổ biến phải là một tham chiếu đến một tệp, trong đó chỉ có các tệp tiêu đề được nhập và không có triển khai (* .m-file) được tìm thấy bởi trình liên kết. Tuy nhiên, thư viện IOBluetooth là một Khung tiêu chuẩn như Khung nền tảng.

Tôi còn thiếu điều gì trong tuyên bố trên?

Tôi cũng đã thử xây dựng nó cho máy 32 bit (xây dựng lại thất bại). Đây rõ ràng là một lỗi của trình liên kết, tuy nhiên tôi không biết nó liên quan gì, ngoại trừ việc có vấn đề với việc tìm kiếm triển khai cho IOBluetoothDevice, trên cả kiến ​​trúc x86 và x64, trong khi các tệp tiêu đề nằm trong Khung bao gồm tiêu chuẩn, được gọi IOBluetooth?

Để biết thông tin của bạn, mã chính của tôi "main.m" là:

#import <Foundation/Foundation.h>
#import <IOBluetooth/objc/IOBluetoothDevice.h>          // Note the import for bluetooth
#import <IOBluetooth/objc/IOBluetoothDeviceInquiry.h>   // Note the import for bluetooth


int main(int argc, const char * argv[])
{
    @autoreleasepool {
        IOBluetoothDevice *currentDevice;
        NSArray *devices = [ IOBluetoothDevice pairedDevices];


        for (id currentDevice in devices){
          NSLog(@"%i : %@",[ currentDevice classOfDevice ], [ currentDevice name ]);    
        }
    }
    return 0;
}

Cảm ơn cho bất kỳ trợ giúp hoặc con trỏ đến đúng hướng.


17
Cố gắng thêm $(inherited)vào Cờ liên kết khác , làm sạch và xây dựng.
Resty

1
Khi tôi gặp phải vấn đề này, tôi thấy tôi phải đến File Inspector cho tập tin m và đánh dấu vào ô bên dưới Thành viên mục tiêu để xuất (?) Nó sang mô-đun nơi tôi đang cố gắng sử dụng nó.
Landon Kuhn

Câu trả lời:


123

Có vẻ như bạn đang thiếu bao gồm cả IOBluetooth.framework trong dự án của bạn. Bạn có thể thêm nó bằng cách:

-Tập vào dự án của bạn ở phía trên bên trái của khung bên trái (biểu tượng màu xanh).

-Trong khung giữa, nhấp vào tab Build Ph Phase.

-Under "Liên kết nhị phân với thư viện", nhấp vào nút dấu cộng.

-Tìm IOBluetooth.framework từ danh sách và nhấn Thêm.

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

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

Điều này sẽ đảm bảo rằng các định nghĩa IOBluetooth.framework được tìm thấy bởi trình liên kết. Bạn có thể thấy rằng khung là thành viên của mục tiêu của bạn bằng cách nhấp vào khung trong khung bên trái và xem tư cách thành viên mục tiêu của khung trong khung bên phải (lưu ý tôi đã di chuyển khung trong nhóm Khung cho mục đích tổ chức):

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


3
Nó đã làm việc! Cảm ơn rất nhiều vì đã nỗ lực để chụp một số ảnh chụp màn hình!
RisingSun

Điều tương tự hoạt động tốt cho khung oAuthIOS. Thêm khung oAuthIOS từ thư mục nhóm vào dự án gốc mà bạn đang cố gắng xây dựng
triển

1
Tôi đang tìm kiếm IOBluetooth.framework, nhưng nó không có ở đó: S
Menno van der Krift 8/10/2015

Thật kỳ lạ, nó nên ở đó.
Chris Livdahl

Tuyệt vời! Tiết kiệm cho tôi một vài giờ!
Bravo Kevin

49

CẬP NHẬT

Apple yêu cầu sử dụng kiến trúc arm64 . Không sử dụng thư viện x32 trong dự án của bạn

Vì vậy, câu trả lời dưới đây là không chính xác nữa!


Câu trả lời cũ

Xcode 5.1 mới đặt kiến ​​trúc armv7, armv7s và arm64 làm mặc định.

Và đôi khi lỗi "xây dựng thất bại Các biểu tượng không xác định cho kiến ​​trúc x86_64" có thể do nguyên nhân này. Bởi vì, một số lib (không phải của Apple) đã được biên dịch cho x32 ban đầu và không hỗ trợ x64.

Vì vậy, những gì bạn cần, là thay đổi "Kiến trúc" cho mục tiêu dự án của bạn như thế này

Lưu ý Nếu bạn đang sử dụng Cocoapods - bạn nên làm tương tự cho mục tiêu "Pods".

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


3
Về cơ bản, tôi đã loại bỏ arm64 thingy khỏi thuộc tính Kiến trúc hợp lệ. Sau đó, như thể hiện ở trên, tôi sẽ chỉ buộc phải xem những gì có trong các kiến ​​trúc hợp lệ mà tôi đoán!
Randika Vishman

@Vishman, chào! Có một câu trả lời SO tốt bao gồm sự khác biệt giữa Valid ArchitecturesArchitectures.
Aleksey Potapov

Đã sửa lỗi liên kết của tôi trong Xcode 5 khi tôi đang cố chạy dự án trong trình giả lập iOS 7.1, trong trình giả lập iOS 6.x, nó hoạt động tốt theo mặc định, thx :)
Zsivics Sanel

@BraveS: Bằng cách loại bỏ kiến ​​trúc arm64, nó có hoạt động với thiết bị 64 bit không?
Jayprakash Dubey

1
@JayprakashDubey hi tôi đã tải lên một cửa hàng ứng dụng tích hợp với hỗ trợ 64 bit, họ đã từ chối ứng dụng của tôi. Khi tôi đang cố gắng thêm arm64, tôi gặp phải lỗi xây dựng lỗi Các biểu tượng không xác định cho kiến ​​trúc x86_64. nếu tôi loại bỏ arm64 khỏi kiến ​​trúc. và tôi đặt arm64 trong kiến ​​trúc hợp lệ. Ứng dụng của tôi có được phê duyệt không ???
SP Balu Kommuri

31

Các ký hiệu không xác định cho kiến ​​trúc x86_64: "_OBJC_CLASS _ $ _ xxx", được tham chiếu từ: objc-class-ref trong yyy.o

Điều này thường có nghĩa là, bạn đang gọi "xxx" (nó có thể là khung hoặc lớp) từ lớp "yyy". Trình biên dịch không thể xác định vị trí "xxx" vì vậy lỗi này xảy ra.

Bạn cần thêm các tệp bị thiếu (trong trường hợp này là "xxx") bằng cách nhấp chuột phải vào thư mục dự án của bạn trong cửa sổ điều hướng và nhấn vào tùy chọn " Thêm tệp vào" YourProjectName " ".

Một cửa sổ bật lên sẽ mở các tệp dự án của bạn trong Finder. Ở đó, bạn có thể thấy các tệp bị thiếu và chỉ cần thêm chúng vào dự án của bạn. Đừng quên đánh dấu vào ô " Sao chép các mục nếu cần ". Chúc may mắn!!


17

Tôi cũng đã thấy lỗi này trên Xcode 7.2 khi dữ liệu dẫn xuất bị hỏng (trong trường hợp của tôi, tôi đã làm gián đoạn quá trình xây dựng và nghi ngờ đó là nguyên nhân gốc).

Vì vậy, nếu các giải pháp khác (đáng chú ý là của Chris và BraveS mà tôi nghi ngờ nhiều khả năng) không phù hợp với vấn đề của bạn, hãy thử xóa dữ liệu dẫn xuất (Chọn: Cửa sổ / Dự án / Dữ liệu được tạo -> Xóa) và xây dựng lại.

(Được thêm vào để người khác tham khảo - Tôi biết câu hỏi ban đầu đã được trả lời đúng).


14

Trong Xcode 9.0b5 bạn có thể gặp phải điều này vì Xcode 9.0b5 có một lỗi trong đó khi bạn thêm mã nguồn, nó không tôn trọng các cài đặt đích. Bạn phải đi vào và đặt mục tiêu của từng tệp theo cách thủ công:

Dự án Xcode với minh họa thành viên mục tiêu thủ công


13

Trong trường hợp của tôi, nó không phải là một thư viện, nó là một số lớp ..

Các ký hiệu không xác định cho kiến ​​trúc x86_64:
"_OBJC_CLASS _ $ _ ClassNmae", được tham chiếu từ: objc-class-ref trong someClassName "...

d: không tìm thấy biểu tượng cho kiến ​​trúc x86_64

clang: error: lệnh linker không thành công với mã thoát 1 (sử dụng -v để xem lệnh gọi)

Giải pháp Tôi đã có một vài mục tiêu trong Xcode với một số lược đồ (Sản xuất, Dev, v.v.) .. một số triển khai mới được thêm vào của tôi (Class.m) đã bị thiếu trong

Xcode-> Mục tiêu-> Xây dựng giai đoạn-> Biên dịch nguồn

Vì vậy, tôi đã phải thêm chúng bằng tay.

sau đó tôi có thể biên dịch và xây dựng thành công.


Điều này đã giải quyết vấn đề của tôi. Tôi đã sử dụng khung năng động. một điều nữa là tôi không thích ý tưởng thêm thủ công.
toxicsun

9

Tôi cũng gặp phải vấn đề tương tự, các phương pháp trên sẽ không hoạt động. Tôi vô tình xóa các tập tin trong thư mục sau đây. nhập mô tả hình ảnh ở đây

Hoặc là

~ / Thư viện / Nhà phát triển / Xcode / DeruredData /

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


4
Đối với những người thắc mắc đường dẫn / lệnh thực tế là gì: thông ~/Library/Developer/Xcode/DerivedData/ qua CLI, bạn có thể xóa thư mục như sau:rm -rf ~/Library/Developer/Xcode/DerivedData/
Bramus

6

Khi cập nhật lên Xcode 7.1, bạn có thể thấy loại lỗi này và không thể giải quyết bằng bất kỳ câu trả lời nào ở trên. Một trong những triệu chứng trong trường hợp của tôi là ứng dụng chạy trên thiết bị không có trong trình giả lập. Bạn có thể sẽ thấy một số lượng lớn lỗi liên quan đến khá nhiều tất cả các khung công tác bạn đang sử dụng.

Cách khắc phục thực sự khá đơn giản. Bạn chỉ cần xóa một mục từ cài đặt "Đường dẫn tìm kiếm khung", được tìm thấy trong phần MỤC TIÊU> Cài đặt bản dựng> Đường dẫn tìm kiếm (đảm bảo chọn tab "Tất cả")

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

Nếu bạn thấy một mục khác ở đây (ngoài $ (được kế thừa)) cho (các) mục tiêu chính hoặc mục tiêu thử nghiệm của bạn, chỉ cần xóa đường dẫn bị lỗi khỏi tất cả các mục tiêu và xây dựng lại.


5

Tôi đã tìm thấy điều này cũng có thể xảy ra nếu bạn kéo một thư mục chứa các tệp Objective-C vào dự án của bạn. Nếu thư mục đó xuất hiện màu xanh tôi nghĩ rằng nó chỉ ra nó không được liên kết chính xác. Bạn có thể xác minh điều này (nếu bạn sử dụng kiểm soát phiên bản) bởi vì bất cứ khi nào bạn thêm tệp mới, tệp pbxproj sẽ cập nhật với các liên kết đến các tệp mới đó. Tuy nhiên, bạn có thể thấy rằng sau khi bạn thêm một thư mục mà tệp pbxproj không thay đổi (và do đó có lỗi liên kết). Vì vậy, bạn sẽ tự động hoàn thành công việc và nó sẽ tìm thấy các lớp bạn đã nhập, nhưng khi nó thực sự xây dựng hình ảnh thì nó lại thất bại với mã lỗi này.

Giải pháp là không thêm thư mục mà là thêm các tệp. Làm điều này và bạn sẽ thấy cập nhật tệp pbxproj và nó sẽ sửa lỗi này.

Điều này cũng cho rằng bạn đã thực hiện những gì được đề xuất ở trên và đã liên kết chính xác tất cả các khung đúng.


5

Tôi đã thử mọi thứ ở đây nhưng vấn đề của tôi hóa ra là tàn dư của một bản dựng cocoapods trước đó. Những gì làm việc cho tôi là:

  1. rm -Rf Pods; pod install
  2. Xóa dữ liệu phái sinh (Cửa sổ / Dự án ... chọn mục tiêu của bạn. Nhấp vào Xóa nút)
  3. Tái tạo

4

Tôi đã có cùng một lỗi, vì thay vì xóa một tập tin, tôi chỉ cần xóa các tham chiếu đến nó. Định vị tệp trong Finder và loại bỏ nó giúp.


3

Tôi biết đó là một câu hỏi cũ nhưng hôm nay có cùng một lỗi và không có giải pháp nào ở trên hoạt động.

Đã sửa nó tuy nhiên bằng cách cài đặt tùy chọn:

Project -> Architecture -> Build Active Architecture Only

đến Có

và biên dịch dự án và xây dựng đúng


3

Tôi đã phải đối mặt với vấn đề này nhiều lần. Điều này thường đến khi bạn xóa thư mục xây dựng của bạn.

Giải pháp dễ dàng là hủy tích hợp và cài đặt lại các tệp pod.

pod deintegrate
pod install

2

Nếu bạn gặp lỗi này khi cố gắng liên kết đến tệp C, trước tiên hãy kiểm tra kỹ tên hàm cho lỗi chính tả. Kiểm tra hai lần tiếp theo rằng bạn không cố gọi hàm C từ môi trường C ++ / Objective-C ++ mà không sử dụng extern C {}cấu trúc. Tôi đã xé tóc ra vì tôi có một lớp trong tệp .mm đang cố gọi các hàm C. Nó không hoạt động vì trong C ++, các biểu tượng được đọc sai. 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. Thiết bị đầu cuối đến đường dẫn của các 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ó biểu tượng 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.

nm -g file.o

Bạn có thể kiểm tra các ký hiệu C ++ được giải mã bằng cách này:

nm -gC file.o

2

Trong trường hợp của tôi, tôi đã xây dựng một khung tùy chỉnh với mục tiêu Triển khai được đặt thành 9.1, nhưng mục tiêu Triển khai của ứng dụng của tôi thấp hơn, hỗ trợ 8.1. Giảm thiểu mục tiêu Triển khai khung tùy chỉnh đã giải quyết vấn đề của tôi.


2

Tôi đến bữa tiệc muộn nhưng nghĩ đến việc chia sẻ thêm một kịch bản nữa, nơi điều này có thể xảy ra. Tôi đã làm việc trên một khung và đang phân phối nó trên cocoapods. Khung công tác có cả các mục tiêu và các lớp và giao thức nhanh chóng và nó đang được xây dựng thành công. Trong khi sử dụng pod trong khung hoặc dự án khác, nó đã báo lỗi này vì tôi quên đưa các tệp .m vào podspec. Vui lòng bao gồm các tệp .swtift, .h và .m trong các nguồn podspec của bạn như dưới đây: s.source_files = "Projectname / Projectname / ** / *. {Swift, h, m}"

Tôi hy vọng nó tiết kiệm thời gian của người khác.


2

Tôi đã giải quyết nó bằng cách thêm "-lc ++" vào Cờ liên kết khác trong Cài đặt bản dựng.


1

Đối với tôi, điều này bắt đầu xảy ra sau khi xung đột hợp nhất.

Tôi đã cố gắng để làm sạch và loại bỏ thư mục xây dựng, nhưng không có gì giúp được. Vấn đề này tiếp tục xảy ra bất kể. Sau đó, tôi đã xem lại tài liệu tham khảo bằng cách xóa các nhóm có vấn đề và thêm lại vào dự án và nó đã hoạt động.



1

trong trường hợp của tôi, tôi đã phải thêm

    target 'SomeTargetTests' do
        inherit! :search_paths
    end
vào podfile của tôi và sau đó xóa thư mục / Pods và chạy `pod install`

(Xcode 10.1)


1

Điều này có thể giúp ai đó. Tôi đã mất nhiều ngày để cuối cùng tìm ra nó. Tôi đang làm việc tại OBJ-C và tôi đã đi đến:

Project-> Build Phases-> Compile sourcesvà thêm VC.mtệp mới tôi vừa thêm.

Tôi đang làm việc với mã kế thừa và tôi thường là một người thông minh, mới đối với OBJ-C vì vậy tôi thậm chí không nghĩ sẽ nhập .mcác tệp của mình vào thư viện nguồn.

BIÊN TẬP:

Chạy vào vấn đề này lần thứ hai và nó là một cái gì đó khác. Câu trả lời này đã cứu tôi sau 5 giờ gỡ lỗi. Đã thử tất cả các tùy chọn trên chủ đề này và nhiều hơn nữa. https://stackoverflow.com/a/13625967/7842175 Vui lòng cung cấp cho anh ấy tín dụng nếu điều này giúp bạn, nhưng về cơ bản, bạn có thể cần phải đặt tệp của mình thành mục tiêu trong trình kiểm tra tệp.

Đây là trình kiểm tra tệp của bạn, chỉ cần đảm bảo tất cả các mục tiêu bạn cần được "đánh dấu"

Nói chung, đây là một mã Lỗi rất mơ hồ có thể được gây ra vì nhiều lý do, vì vậy hãy tiếp tục thử các tùy chọn khác nhau.


1

Thỉnh thoảng, tôi quên sao chép thư viện từ Bản phát hành phổ quát và sao chép nhầm từ Bản phát hành-iphoneos. Thông thường Release-iphoneos chứa tệp .a đã được cắt xén cho X86. và vì vậy nó đưa ra lỗi.


1

trong trường hợp của tôi, loại bỏ lựa chọn thành viên mục tiêu và sau đó chọn một lần nữa khắc phục sự cố.

Kiểm tra câu trả lời của William Cerniuk với ảnh đính kèm.


0

Trong trường hợp của tôi vấn đề đã được biên dịch khung kiến ​​trúc.
Tôi đang chạy Xcode 11 và sử dụng Swift 5.1

  • Tôi đã có 3 mục tiêu như:
    • Ứng dụng của tôi
    • MyAppTests
    • MyAppFrameWork

Tôi đã thử chạy thử nghiệm nhưng sản phẩm MyAppFrameWork đã được biên dịch cho Thiết bị iOS chung và mục tiêu Thử nghiệm cần một nhánh x86-64, vì vậy tôi đã xây dựng lại Khung cho Trình mô phỏng iOS và các trường hợp thử nghiệm bắt đầu chạy thành công.

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.