Các ký hiệu không xác định cho kiến ​​trúc i386: _OBJC_CLASS _ $ _ SKPSMTPMessage ", được tham chiếu từ: error


236

Tôi đã nhập khung để gửi email từ ứng dụng trong nền tức là SKPSMTPMessageKhung. Ai đó có thể đề nghị tại sao lỗi dưới đây được hiển thị

Undefined symbols for architecture i386:

"_OBJC_CLASS_$_SKPSMTPMessage", referenced from:
  objc-class-ref in ConfirmController.o

"_kSKPSMTPPartContentTransferEncodingKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

"_kSKPSMTPPartMessageKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

"_kSKPSMTPPartContentTypeKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status

Nguồn từ khung được lấy: -

Khóa các trường trong MFMailComposeViewCont kiểm

Cập nhật :

Trả lời: Chỉ cần kéo và thả thư mục qua dự án và nhấp vào sao chép. Đó là chọn hộp kiểm dự án và hộp kiểm mục tiêu là tốt.


Sau khi thêm SystemConfiguration.framework từ các giai đoạn xây dựng, dự án của tôi sẽ biên dịch tốt
swiftBoy

Tôi đã giải quyết vấn đề này. Tôi đã thêm khung yêu cầu để Liên kết nhị phân với Thư viện.
Mihir Oza

Câu trả lời:


569

Bạn có thể gặp loại lỗi này nếu tệp .m của lớp của bạn không được liệt kê trong bước "Nguồn biên dịch" của tab "Xây dựng giai đoạn" của mục tiêu. Thông thường Xcode thực hiện điều này cho bạn, nhưng đôi khi nó làm mất cốt truyện và bạn cần thêm tệp .m theo cách thủ công.

Để làm điều này:

TargetSinstall -> Build Phase -> Compile Source -> thêm lớp .m của bạn -> Build and Run


49
Đôi khi những lỗi đó xuất hiện vì một số khung không được liên kết đúng. Chỉ cần kiểm tra tất cả các khung trong "Liên kết nhị phân với thư viện" trong tab giai đoạn xây dựng của dự án.
Heitara

Điều này cũng có thể xảy ra với các tệp .c và có lẽ .mm cũng vậy.
brodney

Rajneesh, bạn đã khắc phục vấn đề? Nếu có, làm thế nào bạn sửa nó?
codematrix

9
Cần lưu ý rằng bạn có thể chọn tệp .m và đánh dấu vào ô bên cạnh mục tiêu của bạn trong phần "Thành viên mục tiêu" bên phải. Khi bạn thêm một tệp vào dự án của mình, bạn sẽ được hỏi nếu bạn muốn "Thêm vào mục tiêu:", bạn có thể đã nói không, nhưng bạn có thể thêm nó bất cứ lúc nào bằng cách làm những gì tôi nói.
Nicolas S

4
Tôi đã từng có cùng một lỗi, giải pháp cho tôi là: Xây dựng cài đặt -> Liên kết -> Cờ liên kết khác -> Thêm -lLibraryName_$(PLATFORM_NAME)dcho gỡ lỗi và thêm -lLibraryName_$(PLATFORM_NAME)cho phát hành
George

37

Đối với tôi, vấn đề hóa ra là thiếu các khung. Khi tôi thêm em, nó hoạt động.


Điều này có vẻ như là một cú sút xa vì nó không thực sự khớp với các thông báo lỗi tôi nhận được nhưng việc thêm các khung phụ thuộc được đề xuất trên trang web SocketRocket cũng đã sửa nó cho tôi.
Pat

Ngay cả khi bạn thêm các khung thông qua cocoapod, điều này có thể xảy ra. Tôi đã phải thêm nó bằng tay như là một khung quá. Cảm ơn!
FBente

Khung mà tôi đã thêm cần các Khung khác cần được thêm trước khi xây dựng. Nếu bạn đang thêm một Khung, hãy kiểm tra để đảm bảo rằng bạn đã thêm bất kỳ Khung nào có thể cần
Dave Patrick

29

Kiểm tra các thuộc tính chỉ Kiến trúc hợp lệ & Xây dựng kiến ​​trúc hoạt động.

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


1
bạn có thể vui lòng cho tôi biết cách mở cửa sổ tùy chọn này trong Xcode 4.2
Anand

Nếu điều này không có ích, hãy xem câu trả lời của Allen Pike bên dưới.
MattyG

Cả câu trả lời này và câu trả lời của Allen đã giúp tôi. Tôi thực sự phải kiểm tra cả hai thứ: Biên dịch nguồn và Chỉ xây dựng kiến ​​trúc hoạt động. Cám ơn mấy đứa nhiều!
Bogdan

@Anand Họ đang ở trong Cài đặt bản dựng cho mục tiêu.
phao cứu sinh

18

nếu bạn đang sử dụng cocoapod, hãy đảm bảo cài đặt bản dựng của mục tiêu chứa $ (được kế thừa) trong phần cờ liên kết khác

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


10

Là khung của bạn được biên dịch cho armv (x)? Theo tôi thì nó giống như được biên dịch cho i386, mã này sẽ không chạy trên thiết bị iOS. Hoặc nếu không, nó được biên dịch cho armv (x) và bạn đang cố chạy nó trên trình giả lập, đó là mã i386. Đảm bảo, bằng cách sử dụng cài đặt bản dựng Akshay được hiển thị ở trên, khung của bạn được biên dịch chính xác cho chip bạn sẽ chạy trên đó.


Nó được sắp xếp. tôi đã phải kéo và thả trình biên dịch khung vào trình biên dịch dự án của mình trong xCode. Cảm ơn
Mann

Có thể bằng cách nào đó biên dịch một khung để chạy trên cả thiết bị iOS và trình giả lập không? hay tôi nên luôn luôn chỉ chọn một lựa chọn?
Aleksey Tsyss

Bạn đang nói về việc mở hai cửa sổ cho cùng một dự án và đặt một cửa sổ để chạy trên trình giả lập và một cửa sổ khác trên thiết bị?
Owen Hartnett

7

Nếu bạn nhập một số dự án khác trong xcode và nếu cả dự án hiện tại và nhập khẩu đều có cùng một tệp trong nguồn Trình biên dịch thì chỉ cần xóa cùng một tệp trong dự án hiện tại trong cài đặt "Xây dựng giai đoạn".


4

Vâng, điều này có liên quan đến những gì allen đã nói ... hãy tìm TargetMembership trong phần Tiện ích của tệp nguồn. có một hộp kiểm liên kết tệp đó với một dự án. Kiểm tra này đã giải quyết vấn đề này cho tôi quá.


Tôi đã sửa đổi tất cả các cài đặt khác, nhưng đây là cài đặt cuối cùng đã sửa nó cho tôi. Cảm ơn!
Alec Thomas

4

Cũng có thể là bạn thiếu liên kết với Thư viện nhị phân, hãy kiểm tra các giai đoạn xây dựng trong mục tiêu của bạn thêm các thư viện cần thiết và sau đó sản phẩm> Sản phẩm sạch> xây dựng

Điều đó cũng phải làm việc!


4

Tôi đã gặp vấn đề này khi tôi mở cùng một dự án hai lần, chỉ có một dự án là bản gốc và dự án kia được sao chép từ một url git.

'Sản phẩm'> 'Sạch' đã giải quyết vấn đề.


4

Tôi cũng đã gặp vấn đề này và tôi đã khắc phục nó bằng cách kiểm tra xem cả biên dịch nguồn và nhị phân liên kết với thư viện có chứa tất cả các tệp / thư viện / khung mà tôi yêu cầu hay không.

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


4

Khi tôi gặp vấn đề tương tự như thế này:

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

_OBJC_CLASS _ $ _ SKPSMTPMessage, được tham chiếu từ: objc-class-ref trong ConfirmControll.o

Hóa ra tôi chỉ quên thêm khung. Chính xác thì đó là QuartzCore.framework.


@JayprakashDubey Hãy hỏi Mitch
D_D

4

thử cái này lần cuối:

Vì vậy, tôi đã thử tất cả các đề xuất trên trang này .. không có cách nào hoạt động .. Cách mà vấn đề của tôi bắt đầu là bằng cách làm theo các bước trong hướng dẫn này hướng dẫn cách liên kết các thư viện tĩnh. Với dự án mẫu của tôi, các hướng dẫn đã hoạt động tốt .. nhưng sau đó, trên dự án thực tế của tôi, tôi bắt đầu gặp lỗi ở trên.

Vì vậy, những gì tôi đã làm là trải qua từng bước của hướng dẫn đã nói và được xây dựng sau mỗi bước .. dòng vi phạm hóa ra là bước này: thêm -all_load để xây dựng cài đặt-> các cờ liên kết khác

hóa ra cờ này đã được đề xuất một lần để liên kết các danh mục với các thư viện tĩnh .. nhưng sau đó hóa ra cờ này không còn cần thiết Xcode 4.2+ .. (tương tự với cờ -force_load .. cũng vậy đề nghị trong các bài viết khác ) ..


3

Khi tôi gặp vấn đề tương tự, tôi đã quên thêm "phiên bản biên dịch của thư viện (có phần mở rộng .a)". Thông thường, chúng tôi thêm thư viện của dự án đã nhập vào Phụ thuộc mục tiêu trong Giai đoạn xây dựng nhưng chúng tôi quên thêm "thư viện đã biên dịch" trong Liên kết nhị phân với thư viện trong giai đoạn xây dựng.


3

Thêm những gì làm việc cho tôi trong trường hợp những người khác có cùng một vấn đề và kết thúc ở đây. Tôi đã có một dự án cũ hơn có cài đặt CLANG_ENABLE_MODULES được đặt thành Không. Sau nhiều giờ thất vọng, tôi đã so sánh với một dự án đang hoạt động và nhận thấy tôi đã bật Mô-đun được đặt thành không theo cài đặt xây dựng LLVM của mình. Đặt điều này thành Có đã giải quyết vấn đề của tôi và ứng dụng sẽ hoạt động tốt.

Cài đặt dự án -> Cài đặt bản dựng -> tìm kiếm 'Mô-đun' và Cập nhật mô-đun kích hoạt (C và Objective-C) thành CÓ.


Sửa chữa tuyệt vời! Điều này đã giúp tôi rất nhiều! Tôi đã có một dự án nhóm cũ và mỗi lần tôi thêm một nhóm mới, lỗi này sẽ xảy ra. Cảm ơn!!!
DiscDev

2

Tôi đã không thêm "-all_load -lstdc ++" vào Cờ liên kết khác trong cài đặt bản dựng và tôi có thể khởi chạy sim mà không gặp lỗi nhưng tôi không nhận được đầu ra nhật ký MonkeyTalk khi ra mắt và tập lệnh trước đó tôi đã viết để kết nối bây giờ hiển thị nút play là vô hiệu hóa. Đầu ra của MT IDE hiển thị là "Kết nối được đặt thành Trình mô phỏng iOS", nhưng không thể chọn nút chạy / phát.

Dự án ban đầu có "ObjC -all_load" trong các Cờ liên kết khác và khi tôi thêm "-all_load -lstdc ++" cùng với nó, tôi đã nhận được thông báo lỗi mà bài đăng này nói về. Khi tôi gỡ bỏ "ObjC -all_load" và chỉ thêm "-all_load -lstdc ++", dự án đã được xây dựng, nhưng vẫn không có nhật ký trò chuyện khỉ nào được đặt làm xác nhận trong bảng điều khiển


2

Có thể bạn đang sử dụng một thư viện chỉ được biên dịch cho phần cứng REAL. Ví dụ: nếu bạn đang sử dụng thư viện Bluetooth như Zephyr HxM Smart, có lẽ nó sẽ không được biên dịch trên trình giả lập và chỉ có nghĩa là chạy trên thiết bị thực.


1

Gặp vấn đề tương tự với iOS 6. Đã có thể giải quyết bằng cách thêm storekit.framework vào "Liên kết nhị phân với thư viện" trong phần xây dựng giai đoạn.

Bây giờ, nó hoạt động như một nét duyên dáng.


1

Tôi có cùng một vấn đề với 7 lỗi khi tôi thêm bộ điều khiển PSTCollectionview. Một giải pháp cho vấn đề này là kiểm tra "xcode -> xây dựng các giai đoạn -> biên dịch các nguồn" ở đây thêm tất cả các tệp ".m" của bạn .. Tôi hy vọng bạn bài viết sẽ giúp người dùng trong tương lai.


1

Với tôi, tôi đã sử dụng Cocoapods cho một dự án thực tế Augmented và điều tôi phát hiện ra là khi bạn triển khai cocoapods và mở .workspace của dự án, bạn kết thúc với mục tiêu Dự án Xcode và các mục tiêu Pods mà bạn đã triển khai trong cùng một tệp. Điều đang xảy ra là một số .m đã được cả hai sử dụng. Sau khi tôi loại bỏ các mục trùng lặp cho mục tiêu Xcode tại Build Ph Phase >> Compile Source, nó hoạt động tốt.


1

Tôi đã phát hiện ra thông báo sai lệch CAO này trong khi cố gắng nâng cấp lên thư viện Google Analytics mới.

Trong trường hợp của tôi, vấn đề là có HAI BẢN SAO CHÉP của thư viện. Chúng nằm trong các thư mục khác nhau nhưng cả hai đều được liệt kê trong Đường dẫn xây dựng thư viện của ứng dụng của tôi (trong Cài đặt bản dựng).

Di chuyển tất cả các tệp thư viện không dùng nữa ra khỏi thư mục cuối cùng đã thực hiện thủ thuật và khiến các thông báo lỗi bí ẩn biến mất.


1

Kiểm tra xem tất cả các tài nguyên gói của bạn được sao chép trong giai đoạn xây dựng.



1

Thay đổi trong kiến ​​trúc hoạt động làm việc cho tôi, Một trong những lib của tôi là sử dụng i386.

Trong cài đặt bản dựng >> thay đổi Chỉ xây dựng Kiến trúc hoạt động thành từ KHÔNG

Nó làm việc cho tôi. Hy vọng nó sẽ giúp cho những người khác là tốt.

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


"Từ KHÔNG đến CÓ" dễ hiểu hơn. Sao cũng được, cái này hiệu quả.
Victor Laerte

0

Trả lời là bạn chỉ cần kéo và thả thư mục qua dự án và nhấp vào sao chép.


0

Tôi nhận được thông báo này khi tôi kéo và thả một số tệp nguồn từ dự án khác. Khi tôi xóa chúng và sau đó thêm chúng thông qua "Thêm tệp ..." từ menu Tệp, nó được tạo mà không có lỗi.


0

Tôi đã gặp một lỗi tương tự với NSManagedObject và đó là do tôi đang sử dụng Dữ liệu lõi nhưng bị thiếu khung Dữ liệu lõi trong Giai đoạn xây dựng - Liên kết nhị phân với thư viện, như một số người khác đã trả lời


Chào mừng đến với SO Sam. Khi trả lời một câu hỏi, hãy cố gắng thêm những hiểu biết, nghiên cứu hoặc mã mới chưa tồn tại trong câu trả lời khác. Nếu bạn chỉ đơn giản muốn chia sẻ rằng một câu trả lời khác có hiệu quả với bạn, hãy thử nâng cấp hoặc nhận xét về câu trả lời của họ thay vì đăng một câu trả lời trùng lặp.
butch

0

Bạn có thể gặp loại lỗi này nếu bạn thêm thư viện của bên thứ ba trong dự án yêu cầu các khung công tác gốc không có trong dự án của bạn.

Bạn cần xem bên trong các tệp .h và .m của thư viện mới được thêm vào của bạn và xem nó yêu cầu các khung công tác nào, sau đó đưa các khung đó vào dự án của bạn (Target> Build Phase> Link Binary With L Library).


0

Hãy thử loại bỏ khung, làm sạch dự án, thêm lại và biên dịch. Hoặc Xóa lớp đã được thêm bởi xcode trong nguồn biên dịch, dọn sạch dự án, thêm nó trở lại sau đó xây dựng.


0

Hãy nhớ rằng bạn có thể đặt một số macro trong bất kỳ trình điều khiển xem nào đang gọi các tệp bạn đã xóa.

Ứng dụng sẽ không hiển thị bất kỳ lỗi nào cho đến khi bạn xây dựng ứng dụng của mình, ứng dụng sẽ đưa ra lỗi trong giai đoạn biên dịch trong các tệp .o.

Hãy nhớ xóa mọi MACRO đang gọi đến các tệp bạn đã xóa.

Cảm ơn :)


0

Ngoài những gì Allan đã làm, thêm các lớp bị thiếu, tôi đã theo dõi giải pháp của @ emdog4 và thêm thư viện Dữ liệu lõi bằng cách đi tới Xây dựng các giai đoạn trong Xcode và trong 'Liên kết nhị phân với các thư viện' nhấp vào + và chọn 'CoreData.framework' . Điều này sắp xếp lỗi của tôi

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.