การสร้าง Xcode ล้มเหลว“ สัญลักษณ์ที่ไม่ได้กำหนดสำหรับสถาปัตยกรรม x86_64”


168

คำถามของ Xcode มือใหม่:

มันเป็นประสบการณ์ครั้งแรกของฉันกับ Xcode 4.6.3

ฉันกำลังพยายามเขียนโปรแกรมคอนโซลที่ง่ายมากซึ่งค้นหาอุปกรณ์ BT ที่จับคู่แล้วพิมพ์ลงใน NSLog

มันสร้างด้วยข้อผิดพลาดดังต่อไปนี้:

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)

ฉันค้นหาอย่างบ้าคลั่ง ปัญหาที่พบบ่อยควรอ้างอิงถึงไฟล์ซึ่งมีเฉพาะไฟล์ส่วนหัวที่นำเข้าและไม่พบการใช้งาน (* .m-file) โดย linker อย่างไรก็ตามห้องสมุด IOBluetooth นั้นเป็น Framework มาตรฐานเช่น Foundation Framework

ฉันหายไปอะไรในคำสั่งด้านบน

ฉันได้ลองสร้างมันด้วยเครื่องจักร 32 บิต (บิลด์ล้มเหลวอีกครั้ง) เห็นได้ชัดว่าเป็นข้อผิดพลาด linker แต่ฉันไม่มีความคิดในสิ่งที่เกี่ยวข้องยกเว้นว่ามีปัญหากับการค้นหาการใช้งานสำหรับ IOBluetoothDevice ทั้งในสถาปัตยกรรม x86 และ x64 ในขณะที่ไฟล์ส่วนหัวมาจากมาตรฐานรวมกรอบเรียกว่า IOBluetooth?

สำหรับข้อมูลของคุณรหัสหลัก "main.m" ของฉันคือ:

#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;
}

ขอบคุณสำหรับความช่วยเหลือหรือตัวชี้ไปในทิศทางที่ถูกต้อง


17
ลองเพิ่ม$(inherited)ในOther Linker Flagsทำความสะอาดและสร้าง
พักผ่อน

1
เมื่อพบสิ่งนี้ฉันพบว่าฉันต้องไปที่ File Inspector สำหรับไฟล์ m และทำเครื่องหมายในช่องใต้ Target Membership เพื่อส่งออก (?) ไปยังโมดูลที่ฉันพยายามจะใช้
แลนดอนคุห์น

คำตอบ:


123

ดูเหมือนว่าคุณขาดหายไปรวมถึง IOBluetooth.framework ในโครงการของคุณ คุณสามารถเพิ่มได้โดย:

- คลิกที่โครงการของคุณที่ด้านซ้ายบนของบานหน้าต่างด้านซ้าย (ไอคอนสีน้ำเงิน)

- ในบานหน้าต่างตรงกลางคลิกที่แท็บสร้างเฟส

ภายใต้ "เชื่อมโยงไบนารีกับไลบรารี่" คลิกที่ปุ่มบวก

- ค้นหา IOBluetooth.framework จากรายการและกด Add

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

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

สิ่งนี้จะทำให้แน่ใจว่า linker ของ IOBluetooth.framework มีการกำหนด คุณจะเห็นว่าเฟรมเวิร์กเป็นสมาชิกของเป้าหมายของคุณโดยคลิกที่เฟรมเวิร์กในบานหน้าต่างด้านซ้ายและดูสมาชิกภาพของเฟรมเวิร์กในบานหน้าต่างด้านขวา (โปรดทราบว่าฉันได้ย้ายเฟรมเวิร์กภายใต้กลุ่ม Frameworks เพื่อวัตถุประสงค์ขององค์กร):

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


3
มันได้ผล! ขอบคุณมากเช่นกันสำหรับความพยายามในการถ่ายภาพหน้าจอ!
RisingSun

สิ่งเดียวกันทำงานได้ดีสำหรับกรอบ oAuthIOS เพิ่มเฟรมเวิร์ก oAuthIOS จากโฟลเดอร์พ็อดไปยังโปรเจ็กต์รูทที่คุณพยายามสร้าง
พัฒนา

1
ฉันค้นหา IOBluetooth.framework แต่ไม่มี: S
Menno van der Krift

มันแปลกนะมันควรจะอยู่ตรงนั้น
Chris Livdahl

! น่ากลัว ช่วยฉันสักชั่วโมง!
Bravo Kevin

49

UPD

Apple ต้องการใช้สถาปัตยกรรมarm64 อย่าใช้ไลบรารี x32 ในโครงการของคุณ

ดังนั้นคำตอบด้านล่างไม่ถูกต้องอีกต่อไป!


คำตอบเก่า

Xcode 5.1 ใหม่ตั้งค่าสถาปัตยกรรม armv7, armv7s และarm64เป็นค่าเริ่มต้น

และบางครั้งข้อผิดพลาด"ความล้มเหลวในการสร้าง" สัญลักษณ์ที่ไม่ได้กำหนดสำหรับสถาปัตยกรรม x86_64 ""อาจเกิดจากสิ่งนี้ เนื่องจากมีการรวบรวม libs (ไม่ใช่ Apple) สำหรับ x32 และไม่รองรับ x64

ดังนั้นสิ่งที่คุณต้องการคือการเปลี่ยน "สถาปัตยกรรม" สำหรับเป้าหมายโครงการของคุณเช่นนี้

NB หากคุณใช้ Cocoapods - คุณควรทำเช่นเดียวกันกับเป้าหมาย "พ็อด"

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


3
โดยทั่วไปฉันลบ arm64 thingy ออกจากคุณสมบัติสถาปัตยกรรมที่ถูกต้อง จากนั้นดังที่แสดงไว้ด้านบนมันจะถูกบังคับเท่านั้นที่จะดูว่ามีอะไรบ้างในสถาปัตยกรรมที่ถูกต้องที่ฉันเดา!
Randika Vishman

@Vishman สวัสดี! มีดีเป็นคำตอบ SOที่ครอบคลุมความแตกต่างระหว่างและValid Architectures Architectures
Aleksey Potapov

แก้ไขข้อผิดพลาดที่เชื่อมโยงของฉันใน Xcode 5 เมื่อฉันพยายามเรียกใช้โครงการในเครื่องจำลอง iOS 7.1 ใน iOS 6.x เครื่องจำลองทำงานได้ดีตามค่าเริ่มต้นขอบคุณ :)
Zsivics Sanel

@BraveS: การลบสถาปัตยกรรม arm64 จะใช้งานกับอุปกรณ์ 64 บิตได้หรือไม่
Jayprakash Dubey

1
@JayprakashDubey สวัสดีฉันอัปโหลด appstore ในตัวโดยไม่สนับสนุน 64 บิตพวกเขาปฏิเสธแอปของฉัน เมื่อฉันพยายามเพิ่ม arm64 ฉันกำลังเผชิญหน้ากับข้อผิดพลาดในการสร้างข้อผิดพลาด“ สัญลักษณ์ที่ไม่ได้กำหนดสำหรับสถาปัตยกรรม x86_64” ถ้าฉันลบ arm64 ออกจากสถาปัตยกรรม และฉันวาง arm64 ในสถาปัตยกรรมที่ถูกต้อง แอพของฉันได้รับการอนุมัติหรือไม่ ???
SP Balu Kommuri

31

สัญลักษณ์ที่ไม่ได้กำหนดสำหรับสถาปัตยกรรม x86_64: "_OBJC_CLASS _ $ _ xxx" อ้างอิงจาก: objc-class-ref ใน yyy.o

โดยทั่วไปหมายถึงคุณกำลังเรียก "xxx" (อาจเป็นกรอบหรือคลาส) จากคลาส "yyy" คอมไพเลอร์ไม่สามารถหา "xxx" เพื่อให้เกิดข้อผิดพลาดนี้

คุณต้องเพิ่มไฟล์ที่หายไป (ในกรณีนี้ "xxx") โดยคลิกขวาที่โฟลเดอร์โครงการของคุณในหน้าต่างนำทางและแตะที่ " เพิ่มไฟล์ไปที่ตัวเลือก" YourProjectName " "

หน้าต่างป๊อปอัพจะเปิดไฟล์โครงการของคุณใน Finder ที่นั่นคุณสามารถดูไฟล์ที่หายไปและเพิ่มลงในโครงการของคุณ อย่าลืมทำเครื่องหมายที่ช่อง " คัดลอกรายการหากจำเป็น " โชคดี!!


17

ฉันเคยเห็นข้อผิดพลาดนี้ใน Xcode 7.2 เมื่อข้อมูลที่ได้รับมาเสียหาย (ในกรณีของฉันฉันขัดจังหวะการสร้างและสงสัยว่าเป็นสาเหตุหลัก)

ดังนั้นหากโซลูชันอื่น ๆ (โดยเฉพาะอย่างยิ่งของ Chris และ BraveS ที่ฉันสงสัยว่ามีแนวโน้มมากกว่า) ไม่พอดีกับปัญหาของคุณลองลบข้อมูลที่ได้รับ (เลือก: หน้าต่าง / โครงการ / ข้อมูลที่ได้รับ -> ลบ) และสร้างใหม่

(เพิ่มเพื่อการอ้างอิงโดยผู้อื่น - ฉันรู้ว่ามีการตอบคำถามเดิมอย่างถูกต้อง)


14

ภายใต้ Xcode 9.0b5 คุณอาจพบปัญหานี้เนื่องจาก Xcode 9.0b5 มีข้อบกพร่องในตำแหน่งเมื่อคุณเพิ่มซอร์สโค้ดมันไม่เป็นไปตามการตั้งค่าเป้าหมาย คุณต้องเข้าไปข้างในและตั้งค่าเป้าหมายแต่ละไฟล์ด้วยตนเองในภายหลัง:

โครงการ Xcode พร้อมภาพประกอบสมาชิกเป้าหมายด้วยตนเอง


13

ในกรณีของฉันมันไม่ใช่ห้องสมุดมันเป็นคลาสบางอย่าง ..

สัญลักษณ์ที่ไม่ได้กำหนดสำหรับสถาปัตยกรรม x86_64:
"_OBJC_CLASS _ $ _ ClassNmae" อ้างอิงจาก: objc-class-ref ใน SomeClassName "

d: ไม่พบสัญลักษณ์สำหรับสถาปัตยกรรม x86_64

clang: ข้อผิดพลาด: คำสั่ง linker ล้มเหลวด้วยรหัสออก 1 (ใช้ -v เพื่อดูการเรียกใช้)

วิธีแก้ปัญหา ฉันมีเป้าหมายหลายอย่างใน Xcode พร้อมด้วยสกีมาหลายรายการ (การผลิต, การพัฒนาและอื่น ๆ ) .. การใช้งานที่เพิ่มเข้ามาใหม่บางส่วนของฉัน (Class.m) หายไป

Xcode-> Targets-> Build Phases-> Compile Sources

ดังนั้นฉันต้องเพิ่มพวกเขาด้วยตนเอง

จากนั้นฉันก็สามารถรวบรวมและสร้างได้สำเร็จ


นี่เป็นการแก้ไขปัญหาของฉัน ฉันใช้ไดนามิกเฟรมเวิร์ก อีกอย่างคือฉันไม่ชอบความคิดที่จะเพิ่มด้วยตนเอง
toxicsun

9

ฉันยังพบปัญหาเดียวกันวิธีการข้างต้นจะไม่ทำงาน ฉันลบไฟล์ในไดเรกทอรีต่อไปนี้โดยบังเอิญ ป้อนคำอธิบายรูปภาพที่นี่

หรือ

~ / Library / Developer / Xcode / DerivedData /

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


4
สำหรับผู้ที่สงสัยว่าคำสั่งพา ธ / คำสั่งที่แท้จริงคืออะไร: ~/Library/Developer/Xcode/DerivedData/ ผ่านทาง CLI คุณสามารถล้างไดเรกทอรีได้ดังนี้:rm -rf ~/Library/Developer/Xcode/DerivedData/
Bramus

6

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

การแก้ไขนั้นค่อนข้างง่ายจริงๆ คุณเพียงแค่ต้องลบรายการออกจากการตั้งค่า "กรอบการค้นหาเส้นทาง" ที่พบในเป้าหมายของคุณ> สร้างการตั้งค่า> ส่วนเส้นทางการค้นหา (ตรวจสอบให้แน่ใจว่าได้เลือกแท็บ "ทั้งหมด")

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

หากคุณเห็นรายการอื่นที่นี่ (นอกเหนือจาก $ (สืบทอดมา)) สำหรับเป้าหมายหลักหรือเป้าหมายทดสอบของคุณเพียงแค่ลบเส้นทางที่ผิดพลาดออกจากเป้าหมายทั้งหมดและสร้างใหม่


5

ฉันพบสิ่งนี้สามารถเกิดขึ้นได้หากคุณลากโฟลเดอร์ที่มีไฟล์ Objective-C ไปยังโครงการของคุณ หากโฟลเดอร์นั้นเป็นสีน้ำเงินฉันคิดว่ามันแสดงว่าลิงก์นั้นไม่ถูกต้อง คุณสามารถตรวจสอบสิ่งนี้ (ถ้าคุณใช้การควบคุมเวอร์ชัน) เพราะเมื่อใดก็ตามที่คุณเพิ่มไฟล์ใหม่ไฟล์ pbxproj ควรอัปเดตพร้อมลิงก์ไปยังไฟล์ใหม่เหล่านั้น อย่างไรก็ตามคุณอาจพบว่าหลังจากที่คุณเพิ่มโฟลเดอร์ที่ไฟล์ pbxproj ไม่เปลี่ยนแปลง (และมีข้อผิดพลาดในการเชื่อมโยง) ดังนั้นคุณจะทำงานอัตโนมัติให้เสร็จสมบูรณ์และจะพบคลาสที่คุณนำเข้า แต่เมื่อมันไปถึงการสร้างภาพจริงมันล้มเหลวด้วยรหัสข้อผิดพลาดนี้

การแก้ปัญหาคือการไม่เพิ่มโฟลเดอร์ แต่ควรเพิ่มไฟล์ ทำสิ่งนี้และคุณควรเห็นการอัพเดตไฟล์ pbxproj และควรแก้ไขข้อผิดพลาดนี้

สิ่งนี้ยังถือว่าคุณได้ทำสิ่งที่แนะนำข้างต้นและเชื่อมโยงกรอบที่เหมาะสมทั้งหมดแล้ว


5

ฉันลองทุกอย่างที่นี่ แต่ปัญหาของฉันกลับกลายเป็นเศษซากของโคโคพอดรุ่นก่อนหน้า สิ่งที่ทำงานให้ฉันคือ:

  1. rm -Rf Pods; pod install
  2. ลบข้อมูลที่ได้รับ (หน้าต่าง / โครงการ ... เลือกเป้าหมายของคุณคลิกปุ่มลบ)
  3. สร้างใหม่

4

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


3

ฉันรู้ว่ามันเป็นคำถามเก่า แต่วันนี้มีข้อผิดพลาดเดียวกันและไม่ได้แก้ปัญหาข้างต้นทำงาน

ได้แก้ไขอย่างไรก็ตามโดยการตั้งค่าตัวเลือก:

Project -> Architecture -> Build Active Architecture Only

เป็นใช่

และรวบรวมโครงการและสร้างอย่างถูกต้อง


3

ฉันต้องเผชิญกับปัญหานี้หลายครั้ง สิ่งนี้มักเกิดขึ้นเมื่อคุณลบโฟลเดอร์บิลด์

ทางออกที่ง่ายคือยกเลิกการรวมและติดตั้งไฟล์พ็อดอีกครั้ง

pod deintegrate
pod install

2

หากคุณได้รับข้อผิดพลาดนี้เมื่อพยายามเชื่อมโยงไปยังไฟล์ C อันดับแรกให้ตรวจสอบชื่อฟังก์ชั่นสำหรับการพิมพ์ผิด ตรวจสอบอีกครั้งถัดไปว่าคุณไม่ได้พยายามเรียกใช้ฟังก์ชัน C จากสภาพแวดล้อม C ++ / Objective-C ++ โดยไม่ต้องใช้extern C {}โครงสร้าง ฉันฉีกขาดออกเพราะฉันมีชั้นเรียนที่อยู่ในไฟล์. mm ซึ่งพยายามเรียกใช้ฟังก์ชัน C มันไม่ทำงานเพราะใน C ++ สัญลักษณ์ต่าง ๆ คุณสามารถเห็นสัญลักษณ์รูปธรรมที่สร้างขึ้นโดยใช้เครื่องมือ nm เทอร์มินัลไปยังพา ธ ของไฟล์. o และรันnm -gบนไฟล์ที่เรียกสัญลักษณ์และอันที่ควรมีสัญลักษณ์และคุณควรดูว่ามันตรงกันหรือไม่ซึ่งสามารถให้เบาะแสสำหรับข้อผิดพลาด

nm -g file.o

คุณสามารถตรวจสอบสัญลักษณ์ C ++ ที่ถูก demangled ด้วยสิ่งนี้:

nm -gC file.o

2

ในกรณีของฉันฉันสร้างกรอบงานที่กำหนดเองโดยมีเป้าหมายการปรับใช้เป็น 9.1 แต่เป้าหมายการปรับใช้ของแอพของฉันต่ำกว่าซึ่งรองรับ 8.1 ลดเป้าหมายการปรับใช้เฟรมเวิร์กที่กำหนดเองให้เล็กที่สุดแก้ปัญหาของฉันได้


2

ฉันไปงานปาร์ตี้สาย แต่คิดว่าจะแบ่งปันอีกหนึ่งสถานการณ์ที่อาจเกิดขึ้นได้ ฉันทำงานเกี่ยวกับกรอบและแจกจ่ายให้กับ cocoapods เฟรมเวิร์กมีทั้งวัตถุประสงค์ c และคลาสที่รวดเร็วและโปรโตคอลและมันสร้างได้สำเร็จ ในขณะที่ใช้พ็อดในเฟรมเวิร์กหรือโครงการอื่นมันทำให้เกิดข้อผิดพลาดนี้เพราะฉันลืมใส่ไฟล์. m ในพอดสเปค โปรดระบุไฟล์. swtift, .h และ. m ในแหล่งที่มาของ podspec ดังนี้: s.source_files = "ชื่อโปรเจ็กต์ / ชื่อโปรเจ็กต์ / ** / *. {swift, h, m}"

ฉันหวังว่ามันจะช่วยประหยัดเวลาของคนอื่น



1

สำหรับฉันสิ่งนี้เริ่มเกิดขึ้นหลังจากการรวมความขัดแย้ง

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



1

ในกรณีของฉันฉันต้องเพิ่ม

    target 'SomeTargetTests' do
        inherit! :search_paths
    end
ไปที่ podfile ของฉันแล้วลบไดเรกทอรี / Pods และเรียกใช้ 'pod install`

(Xcode 10.1)


1

นี่อาจช่วยใครซักคน ฉันใช้เวลาหลายวันกว่าจะคิดออก ฉันทำงานใน OBJ-C และฉันไปที่:

Project-> Build Phases-> Compile sourcesและเพิ่มVC.mไฟล์ใหม่ที่ฉันเพิ่งเพิ่ม

ฉันกำลังทำงานกับรหัสดั้งเดิมและโดยปกติฉันจะเป็นคนใหม่ที่ไม่คุ้นเคยกับ OBJ-C ดังนั้นฉันจึงไม่คิดที่จะนำเข้า.mไฟล์ของฉันไปยังไลบรารีแหล่งข้อมูล

แก้ไข:

แก้ไขปัญหานี้เป็นครั้งที่สองและมันเป็นอย่างอื่น คำตอบนี้ช่วยฉันได้หลังจากการดีบัก 5 ชั่วโมง ลองใช้ตัวเลือกทั้งหมดในชุดข้อความนี้และอื่น ๆhttps://stackoverflow.com/a/13625967/7842175โปรดให้เครดิตแก่เขาหากสิ่งนี้ช่วยคุณได้ แต่โดยทั่วไปคุณอาจต้องตั้งค่าไฟล์ของคุณเป็นเป้าหมายในตัวตรวจสอบไฟล์

นี่คือตัวตรวจสอบไฟล์ของคุณเพียงแค่ตรวจสอบให้แน่ใจว่าเป้าหมายทั้งหมดที่คุณต้องการนั้นเป็น

สรุปแล้วนี่เป็นรหัสข้อผิดพลาดที่คลุมเครือซึ่งอาจเกิดจากสาเหตุหลายประการดังนั้นโปรดลองใช้ตัวเลือกอื่น ๆ


1

บางครั้งฉันลืมที่จะคัดลอกไลบรารี่จาก Release-universal และคัดลอกผิดพลาดจาก Release-iphoneos โดยปกติ Release-iphoneos จะมีไฟล์. a ซึ่งถูกตัดแต่งสำหรับ X86 และมันทำให้เกิดข้อผิดพลาด


1

ในกรณีของฉันลบการเลือกสมาชิกภาพเป้าหมายแล้วเลือกอีกครั้งแก้ไขปัญหา

ตรวจสอบคำตอบของ William Cerniuk พร้อมแนบรูปถ่าย


0

ในกรณีของฉันปัญหารวบรวมสถาปัตยกรรมกรอบ
ฉันใช้Xcode 11และใช้Swift 5.1

  • ฉันมี 3 เป้าหมายเช่น:
    • แอปของฉัน
    • MyAppTests
    • MyAppFrameWork

ฉันพยายามเรียกใช้การทดสอบ แต่ผลิตภัณฑ์ MyAppFrameWork ได้รับการคอมไพล์สำหรับGeneric iOS Devicesและเป้าหมายการทดสอบจำเป็นต้องมีแขน x86-64 ดังนั้นฉันจึงสร้างเฟรมเวิร์กสำหรับ iOS Simulators และกรณีทดสอบสำเร็จเริ่มทำงาน

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