สัญลักษณ์ที่ไม่ได้กำหนดสำหรับสถาปัตยกรรม i386: _OBJC_CLASS _ $ _ SKPSMTPMessage "อ้างอิงจาก: error


236

ฉันได้นำเข้ากรอบงานสำหรับส่งอีเมลจากแอปพลิเคชันในพื้นหลังเช่นSKPSMTPMessageFramework มีคนแนะนำว่าทำไมข้อผิดพลาดด้านล่างจึงปรากฏขึ้น

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

แหล่งที่มาจากกรอบการทำงาน: -

การล็อคฟิลด์ใน MFMailComposeViewController

อัปเดต :

คำตอบ: เพียงลากและวางโฟลเดอร์บนโปรเจ็กต์แล้วคลิกคัดลอก เลือกกล่องกาเครื่องหมายโครงการและกำหนดเป้าหมายด้วยเช่นกัน


หลังจากเพิ่มSystemConfiguration.frameworkจากการสร้างขั้นตอนโครงการของฉันรวบรวมดี
swiftBoy

ฉันแก้ไขปัญหานี้ฉันได้เพิ่มกรอบงานข้อกำหนดเพื่อเชื่อมโยงไบนารีกับไลบรารี
Mihir Oza

คำตอบ:


569

คุณสามารถรับข้อผิดพลาดประเภทนี้ได้หากไฟล์ '.m คลาสของคุณไม่อยู่ในรายการภายใต้ขั้นตอน "แหล่งรวบรวม" ของแท็บ "สร้างเฟส" ของเป้าหมายของคุณ โดยปกติ Xcode จะทำสิ่งนี้ให้คุณ แต่บางครั้งมันจะเสียพล็อตและคุณต้องเพิ่มไฟล์. m ด้วยตนเอง

เพื่อทำสิ่งนี้:

TargetSettings -> Build Phases -> Compile Sources -> เพิ่มคลาส. m ของคุณ -> Build and Run


49
บางครั้งข้อผิดพลาดเหล่านั้นปรากฏขึ้นเนื่องจากกรอบงานบางอย่างไม่ได้เชื่อมโยงอย่างเหมาะสม เพียงตรวจสอบกรอบทั้งหมดใน "ลิงก์ไบนารีกับไลบรารี" ในแท็บสร้างเฟสของโครงการ
Heitara

สิ่งนี้สามารถเกิดขึ้นได้กับไฟล์. c และอาจเป็น. mm ด้วย
brodney

Rajneesh คุณช่วยแก้ไขปัญหาเหรอ? ถ้าใช่คุณแก้ไขได้อย่างไร
codematrix

9
มันน่าสังเกตว่าคุณสามารถเลือกไฟล์. m และทำเครื่องหมายที่ช่องถัดจากเป้าหมายของคุณในแผงด้านขวา "เป้าหมายการเป็นสมาชิก" ส่วน เมื่อคุณเพิ่มไฟล์ลงในโครงการของคุณคุณจะถูกถามว่าคุณต้องการ "เพิ่มไปยังเป้าหมาย:" คุณอาจไม่ได้กล่าว แต่คุณสามารถเพิ่มได้ตลอดเวลาโดยทำสิ่งที่ฉันพูด
Nicolas S

4
ฉันเคยมีข้อผิดพลาดเดียวกันวิธีแก้ปัญหาของฉันคือ: การตั้งค่าการสร้าง -> การเชื่อมโยง -> การเชื่อมโยงธงอื่น ๆ -> เพิ่ม-lLibraryName_$(PLATFORM_NAME)dสำหรับการดีบักและเพิ่ม-lLibraryName_$(PLATFORM_NAME)สำหรับการวางจำหน่าย
จอร์จ

37

สำหรับฉันปัญหากลายเป็นกรอบที่ขาดหายไป เมื่อฉันเพิ่ม em มันทำงานได้


นี่ดูเหมือนจะเป็นเวลานานเพราะมันไม่ตรงกับข้อความแสดงข้อผิดพลาดที่ฉันได้รับ แต่เพิ่มเฟรมเวิร์กตามที่แนะนำบนไซต์ SocketRocket ให้แก้ไขด้วยเช่นกัน
Pat

แม้ว่าคุณจะเพิ่มกรอบผ่านcocoapodsสิ่งนี้สามารถเกิดขึ้นได้ ฉันต้องเพิ่มมันเป็นเฟรมเวิร์กด้วยตนเอง ขอบคุณ!
FBente

Framework ที่ฉันเพิ่มต้องการ Framework อื่น ๆ ที่จะเพิ่มก่อนที่จะสร้าง หากคุณกำลังเพิ่ม Framework ให้ตรวจสอบเพื่อให้แน่ใจว่าคุณได้เพิ่ม Framework ใด ๆ ที่จำเป็น
Dave Patrick

29

ตรวจสอบคุณสมบัติสถาปัตยกรรมที่ถูกต้อง & สร้างสถาปัตยกรรมที่ใช้งานอยู่เท่านั้น

ป้อนคำอธิบายรูปภาพที่นี่


1
คุณสามารถโปรดบอกวิธีการเปิดหน้าต่างตัวเลือกนี้ใน Xcode 4.2
อานันท์

หากสิ่งนี้ไม่ช่วยให้ดูคำตอบของ Allen Pike ด้านล่าง
MattyG

ทั้งคำตอบนี้และอัลเลนช่วยได้ ฉันต้องตรวจสอบทั้งสองอย่างจริงๆ: รวบรวมแหล่งที่มาและสร้างสถาปัตยกรรมที่ใช้งานอยู่เท่านั้น ขอบคุณมาก ๆ เลย!
Bogdan

@Anand พวกมันอยู่ใน Build Settings สำหรับเป้าหมาย
lifelogger

18

หากคุณกำลังใช้ cocoapods ตรวจสอบให้แน่ใจว่าการตั้งค่าการสร้างของเป้าหมายของคุณมี$ (สืบทอดมา)ในส่วนของธงลิงเกอร์อื่น ๆ

ป้อนคำอธิบายรูปภาพที่นี่


10

เฟรมเวิร์กของคุณรวบรวมสำหรับ armv (x) หรือไม่? มันดูเหมือนว่าฉันจะรวบรวมสำหรับ i386 ซึ่งรหัสจะไม่ทำงานบนอุปกรณ์ iOS มิฉะนั้นมันจะถูกรวบรวมสำหรับ armv (x) และคุณกำลังพยายามเรียกใช้บนเครื่องจำลองซึ่งเป็นรหัส i386 ตรวจสอบให้แน่ใจว่าใช้การตั้งค่าการสร้าง Akshay ที่แสดงด้านบนว่าเฟรมเวิร์กของคุณได้รับการคอมไพล์อย่างถูกต้องสำหรับชิปที่คุณจะใช้งาน


มันเรียงลำดับ ฉันต้องลากแล้วปล่อยเฟรมเวิร์กเดอร์ไปยังโปรเจ็กต์ forlder ใน xCode ขอบคุณ
Mann

เป็นไปได้ไหมที่จะรวบรวมเฟรมเวิร์กให้ทำงานบนทั้งอุปกรณ์ iOS และอุปกรณ์จำลองพร้อมกัน? หรือฉันควรเลือกตัวเลือกเดียวเท่านั้น?
Aleksey Tsyss

คุณกำลังพูดถึงการเปิดหน้าต่างสองบานไปยังโครงการเดียวกันและตั้งค่าหนึ่งให้ทำงานบนเครื่องจำลองและหน้าต่างอื่นบนอุปกรณ์หรือไม่
Owen Hartnett

7

หากคุณนำเข้าโครงการอื่น ๆ ใน xcode และหากโครงการปัจจุบันและโครงการนำเข้ามีไฟล์เดียวกันในแหล่งที่มาของคอมไพเลอร์แล้วเพียงแค่ลบไฟล์เดียวกันในโครงการปัจจุบันในการตั้งค่า "สร้างเฟส" มันใช้งานได้สำหรับฉัน


4

ใช่สิ่งนี้เกี่ยวข้องกับสิ่งที่อัลเลนพูด ... มองหา TargetMembership ในส่วนของยูทิลิตี้ของไฟล์ต้นฉบับ มีช่องทำเครื่องหมายที่เชื่อมโยงไฟล์กับโครงการ การตรวจสอบนี้แก้ไขปัญหานี้ให้ฉันด้วย


ฉันแก้ไขการตั้งค่าอื่น ๆ ทั้งหมด แต่นี่เป็นสิ่งที่ฉันได้แก้ไขในที่สุด ขอบคุณ!
Alec Thomas

4

อาจเป็นไปได้ว่าคุณขาดการเชื่อมโยงกับห้องสมุดไบนารีตรวจสอบ Build Phases ในเป้าหมายของคุณเพิ่มห้องสมุดที่ต้องการจากนั้นผลิตภัณฑ์> ผลิตภัณฑ์ที่สะอาด> Build

นั่นต้องทำงานด้วย!


4

ฉันมีปัญหานี้เมื่อฉันเปิดโครงการเดียวกันสองครั้งมีเพียงโครงการเดียวเท่านั้นที่เป็นต้นฉบับและอีกโครงการหนึ่งถูกโคลนจาก URL คอมไพล์

'ผลิตภัณฑ์'> 'สะอาด' แก้ไขปัญหาได้


4

ฉันยังพบปัญหานี้และฉันแก้ไขโดยตรวจสอบว่าทั้งคอมไพล์ซอร์สและลิงค์ไบนารีกับไลบรารีมีไฟล์ / library / framework ทั้งหมดที่ฉันต้องการ

ป้อนคำอธิบายรูปภาพที่นี่


4

เมื่อฉันพบปัญหาเดียวกันกับสิ่งนี้:

สัญลักษณ์ที่ไม่ได้กำหนดสำหรับสถาปัตยกรรม i386:

_OBJC_CLASS _ $ _ SKPSMTPMessage อ้างอิงจาก: objc-class-ref ใน ConfirmController.o

ปรากฎว่าฉันลืมที่จะเพิ่มกรอบ มันเป็น QuartzCore.framework ที่แน่นอน


@JayprakashDubey ถาม Mitch โปรด
D_D

4

ลองอันนี้ครั้งสุดท้าย:

ดังนั้นฉันจึงลองใช้คำแนะนำทั้งหมดในหน้านี้ .. ไม่มีวิธีการทำงาน .. วิธีที่ปัญหาของฉันเริ่มต้นคือทำตามขั้นตอนในบทช่วยสอนนี้ที่สอนวิธีเชื่อมโยงไลบรารีแบบคงที่ ด้วยโครงการตัวอย่างของฉันคำแนะนำใช้งานได้ดี แต่แล้วในโครงการจริงของฉันฉันเริ่มได้รับข้อผิดพลาดด้านบน

ดังนั้นสิ่งที่ฉันทำคือผ่านแต่ละขั้นตอนของการสอนและสร้างขึ้นหลังจากแต่ละขั้นตอน .. บรรทัดที่ละเมิดกลายเป็นอันนี้: เพิ่ม -all_load เพื่อสร้างการตั้งค่า -> ธงลิงเกอร์อื่น ๆ

ปรากฎว่ามีการแนะนำให้ใช้แฟล็กนี้กาลครั้งหนึ่งเพื่อเชื่อมโยงหมวดหมู่กับไลบรารีสแตติก .. แต่แล้วปรากฎว่าแฟล็กนี้ไม่จำเป็นต้องใช้ Xcode 4.2+ .. อีกต่อไป (เหมือนกันสำหรับแฟล็ก -force_load .. ซึ่งก็เช่นกัน แนะนำในโพสต์อื่น ๆ) ..


3

เมื่อฉันพบปัญหาเดียวกันฉันลืมเพิ่ม "ไลบรารีเวอร์ชันที่คอมไพล์แล้ว (ด้วยนามสกุล. a)" โดยปกติเราจะเพิ่มห้องสมุดของโครงการที่นำเข้าใน Target Dependency ใน Build Phases แต่เราลืมเพิ่ม "compiled library" ใน Link Binary กับ Library ใน Build Phases


3

การเพิ่มสิ่งที่ใช้ได้ผลสำหรับฉันในกรณีที่คนอื่นมีปัญหาเดียวกันและจบที่นี่ ฉันมีโปรเจ็กต์เก่าที่มีการตั้งค่า CLANG_ENABLE_MODULES ตั้งค่าเป็นไม่หลังจากชั่วโมงแห่งความยุ่งยากฉันเปรียบเทียบกับโครงการที่ใช้งานได้และพบว่าฉันได้เปิดใช้งานโมดูลตั้งค่าเป็นไม่ภายใต้การตั้งค่าการสร้าง LLVM ของฉัน การตั้งค่านี้เป็นใช่แก้ไขปัญหาของฉันแล้วแอปพลิเคชั่นก็ทำงานได้ดี

การตั้งค่าโครงการ -> สร้างการตั้งค่า -> ค้นหา 'โมดูล' และอัปเดตเปิดใช้งานโมดูล (C และ Objective-C) เป็น YES


แก้ไขที่ยอดเยี่ยม! สิ่งนี้ช่วยฉันได้มาก! ฉันมีโครงการพ็อดเก่าและทุกครั้งที่ฉันเพิ่มพ็อดใหม่ข้อผิดพลาดนี้จะเกิดขึ้น ขอบคุณ !!!
DiscDev

2

ฉันไม่ได้เพิ่ม "-all_load -lstdc ++" ลงใน Other Linker Flags ในการตั้งค่าการสร้างและฉันสามารถเปิดตัวซิมได้โดยไม่มีข้อผิดพลาด แต่ฉันไม่ได้รับเอาต์พุตของ MonkeyTalk log เมื่อเปิดตัวและสคริปต์ก่อนหน้านี้ที่ฉันใช้ในการเชื่อมต่อ ตอนนี้แสดงปุ่มเล่นเป็นปิดการใช้งาน ผลลัพธ์ของ MT IDE แสดงว่า "การเชื่อมต่อถูกตั้งค่าเป็น iOS Simulator" แต่ไม่สามารถเลือกปุ่มเรียกใช้ / เล่นได้

โครงการเดิมมี "ObjC -all_load" ใน Other Linker Flags และเมื่อฉันต่อท้าย "-all_load -lstdc ++" พร้อมด้วยฉันได้รับข้อความแสดงข้อผิดพลาดที่โพสต์นี้เกี่ยวกับ เมื่อฉันลบ "ObjC -all_load" และเพิ่มเฉพาะ "-all_load -lstdc ++" โครงการที่สร้าง แต่ยังไม่มีการพูดคุยกับลิงเอาไว้เป็นการยืนยันในคอนโซล


2

เป็นไปได้ว่าคุณกำลังใช้ไลบรารีที่รวบรวมสำหรับฮาร์ดแวร์ REAL เท่านั้น ตัวอย่างเช่นหากคุณใช้ห้องสมุดบลูทู ธ เช่น Zephyr HxM Smart มันอาจจะไม่คอมไพล์ในเครื่องจำลองและใช้เพื่อทำงานบนอุปกรณ์จริงเท่านั้น


1

พบปัญหาที่คล้ายกันกับ IOS 6 สามารถแก้ไขได้ด้วยการเพิ่ม storekit.framework ไปที่ "Link Binary with Libraries" ในส่วนขั้นตอนการสร้าง

ตอนนี้มันใช้งานได้เหมือนมีเสน่ห์


1

ฉันมีปัญหาเดียวกันกับ 7 ข้อผิดพลาดเมื่อฉันเพิ่ม PSTCollectionviewcontroller วิธีแก้ปัญหาหนึ่งสำหรับปัญหานี้คือตรวจสอบ "xcode -> build phases -> คอมไพล์แหล่งที่มา" ที่นี่เพิ่มไฟล์ ".m" ทั้งหมดของคุณ โพสต์จะช่วยผู้ใช้ในอนาคต


1

ในตอนนี้ฉันกำลังใช้ Cocoapods สำหรับโครงการ Augmented Reality และสิ่งที่ฉันค้นพบคือเมื่อคุณใช้ cocoapods และเปิดพื้นที่ทำงานของโครงการคุณจะจบลงด้วยเป้าหมายโครงการ Xcode และเป้าหมาย Pod ที่คุณนำไปใช้ในไฟล์เดียวกัน สิ่งที่เกิดขึ้นคือทั้ง. m บางตัวถูกใช้งาน หลังจากที่ฉันลบรายการที่ซ้ำกันสำหรับเป้าหมาย Xcode ที่ Build Phases >> Compile Sources มันใช้ได้ดี


1

ฉันค้นพบข้อความที่ทำให้เข้าใจผิดสูงนี้ขณะที่พยายามอัปเกรดเป็นห้องสมุด Google Analytics ใหม่

ในกรณีของฉันปัญหาเกิดขึ้นกับสำเนาความขัดแย้งของห้องสมุดสองรายการ พวกเขาอยู่ในโฟลเดอร์ที่แตกต่างกัน แต่ทั้งคู่แสดงอยู่ในเส้นทาง Build Library ของ App ของฉัน (ภายใต้ Build Settings)

การย้ายไฟล์ไลบรารีที่คัดค้านทั้งหมดออกจากโฟลเดอร์นั้นจบลงด้วยการทำเคล็ดลับและทำให้ข้อความผิดพลาดลึกลับหายไป


1

ตรวจสอบว่าทรัพยากรบันเดิลทั้งหมดของคุณถูกคัดลอกในระยะการสร้าง



1

สถาปัตยกรรมการเปลี่ยนแปลงที่ใช้งานได้สำหรับฉันหนึ่งใน lib ของฉันใช้ i386

ในการตั้งค่าการสร้าง >> เปลี่ยนสร้างสถาปัตยกรรมที่ใช้งานอยู่เป็นใช่จากไม่

มันใช้งานได้สำหรับฉัน หวังว่าจะช่วยให้ผู้อื่นเช่นกัน

ป้อนคำอธิบายรูปภาพที่นี่


"จากไม่เป็นใช่" ง่ายต่อการเข้าใจ อะไรก็ตามมันก็ใช้ได้
Victor Laerte

0

คำตอบคือคุณเพียงแค่ลากและวางโฟลเดอร์บนโปรเจ็กต์แล้วคลิกคัดลอก


0

ฉันได้รับข้อความนี้เมื่อฉันลากและวางไฟล์ต้นฉบับบางไฟล์จากโครงการอื่น เมื่อฉันลบพวกเขาแล้วเพิ่มพวกเขาผ่าน "เพิ่มไฟล์ ... " จากเมนูไฟล์มันสร้างขึ้นโดยไม่มีข้อผิดพลาด


0

ฉันมีข้อผิดพลาดคล้ายกันกับ NSManagedObject และเป็นเพราะฉันใช้ Core Data แต่ไม่มีกรอบข้อมูล Core ใน Build Phases - Link Binary With Libraries เหมือนที่คนอื่น ๆ ตอบ


ยินดีต้อนรับสู่ SO Sam เมื่อตอบคำถามให้ลองเพิ่มความเข้าใจใหม่วิจัยหรือรหัสที่ไม่มีอยู่ในคำตอบอื่น หากคุณต้องการแบ่งปันคำตอบอื่นที่เหมาะกับคุณให้ลองอัปโหลดหรือแสดงความคิดเห็นในคำตอบของพวกเขาแทนการโพสต์คำตอบซ้ำ
บุตช์

0

คุณสามารถรับข้อผิดพลาดประเภทนี้ได้หากคุณเพิ่มไลบรารีบุคคลที่สามในโครงการของคุณที่ต้องการเฟรมเวิร์กดั้งเดิมที่ไม่รวมอยู่ในโครงการของคุณ

คุณต้องมองเข้าไปในไฟล์. h และ. m ของไลบรารีที่เพิ่มใหม่ของคุณและดูว่าเฟรมเวิร์กนั้นต้องการอะไรจากนั้นรวมเฟรมเวิร์กเหล่านั้นไว้ในโครงการของคุณ (เป้าหมาย> สร้างเฟส> ลิงค์ไบนารี่กับไลบรารี)


0

ลองลบเฟรมเวิร์กล้างโปรเจ็กต์เพิ่มกลับและคอมไพล์ หรือลบคลาสที่ถูกเพิ่มโดย xcode ในคอมไพล์ซอร์ส, ทำความสะอาดโปรเจ็กต์, เพิ่มมันกลับมาแล้วสร้าง


0

โปรดจำไว้ว่าคุณสามารถใส่แมโครบางตัวในมุมมองตัวควบคุมใด ๆ ที่กำลังเรียกไฟล์ที่คุณลบไปแล้ว

แอปจะไม่แสดงข้อผิดพลาดใด ๆ จนกว่าคุณจะสร้างแอปของคุณมันจะโยนข้อผิดพลาดในขั้นตอนการรวบรวมเป็นไฟล์. o

อย่าลืมลบ MACRO ที่เรียกไฟล์ที่คุณลบไปแล้ว

ขอบคุณ :)


0

นอกเหนือจากสิ่งที่อัลลันทำแล้วเพิ่มคลาสที่ขาดหายไปฉันได้ติดตามโซลูชันของ @ emdog4 และเพิ่มคลังข้อมูล Core โดยไปที่การสร้างเฟสใน Xcode และภายใต้ 'ลิงก์ไบนารีกับไลบรารี' คลิกที่ + และเลือก 'CoreData.framework' . นี่เป็นข้อผิดพลาดของฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.