ข้อผิดพลาด Xcode linker: ไฟล์เล็กเกินไปสำหรับสถาปัตยกรรม x86_64


89

ฉันกำลังพัฒนาแอปพลิเคชันใน Xcode

เมื่อฉันพยายามสร้างข้อผิดพลาดนี้เกิดขึ้น:

ld: in /Users/theodore/Library/Developer/Xcode/DerivedData/Tower-bkpdifuqssebjdgurzmtirbxejnn/Build/Intermediates/Tower.build/Debug/Tower.build/Objects-normal/x86_64/TWRAppDelegate.o, file too small for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

ไม่มีใครรู้ว่ามีอะไรผิดปกติ?


60
ลองสร้าง / ล้างใหม่ทั้งหมด เป็นไปได้ว่าโครงสร้างก่อนหน้านี้ถูกยกเลิกอย่างผิดปกติทำให้TWRAppDelegate.oไฟล์เสียหายหรือมีขนาดเป็นศูนย์
Martin Baulig

5
ความแม่นยำเล็กน้อย: คุณทำเช่นนั้นด้วย cmd + shift + k หากไม่ได้ผลให้ไปที่โฟลเดอร์ข้อมูลที่ได้รับและลบโฟลเดอร์ที่มีชื่อว่าโครงการของคุณ
Ramy Al Zuhouri

3
@RamyAlZuhouri: ไม่จำเป็นต้องไป Trashing สร้างโฟลเดอร์ด้วยตัวเองอีกต่อไป กด Option ค้างไว้และคำสั่ง Clean (ซึ่งอยู่ในเมนูผลิตภัณฑ์) จะเปลี่ยนเป็น“ Clean Build Folder …” ซึ่งทำเพื่อคุณ
Peter Hosey

คำแนะนำของ Martin Baulig ช่วยแก้ปัญหาของฉันได้ ขอบคุณ!
tbodt

2
@ ปีเตอร์เค. มันทำให้ฉันได้รับป้ายเงิน Nice Question :-)
tbodt

คำตอบ:


193

คำตอบของ Stealing @ martin-baulig:

ลองสร้าง / ล้างใหม่ทั้งหมด เป็นไปได้ว่าบิลด์ก่อนหน้านี้ถูกยกเลิกอย่างผิดปกติทำให้ไฟล์ TWRAppDelegate.o เสียหายหรือมีขนาดเป็นศูนย์


7
ในที่สุด! เธอควรจะได้รับมัน.
tbodt

ขอบคุณ! :-) เอาล่ะคำตอบของ @ martin-bailig ในความคิดเห็นช่วยฉันได้ แต่จะดีกว่าถ้าให้ที่นี่เป็นคำตอบที่แท้จริง
Peter K.

3
โครงการของฉันใช้เวลาสักพักในการสร้าง คุณสามารถหลีกเลี่ยงการลบไฟล์อ็อบเจ็กต์ 1-4 ไฟล์ที่เสียหายได้หากคุณหยุดการสร้างอย่างผิดปกติแทนที่จะเป็นทุกอย่าง
Fernando Mazzon

22

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


3
คำตอบของคุณช่วยฉันได้ 10 นาทีในการสร้างโครงการใหม่! ขอบคุณ
Accid Bright

คำตอบนี้ควรไปด้านบน!
Ting Yi Shih

8

หากต้องการแก้ไขปัญหานี้โดยอัตโนมัติBuild Script Phaseสามารถเพิ่มได้ ไปที่ Xcode -> โครงการของคุณ -> เป้าหมายของคุณ -> ขั้นตอนการสร้าง -> + -> เฟสสคริปต์การรันใหม่

เปลี่ยนชื่อเป็นXcode Link Fixและย้ายไปไว้เหนือCompile Sourcesเฟส วางสิ่งนี้ลงในเนื้อหาสคริปต์:

# Legacy build system
legacy_dir=`dirname "${LD_DEPENDENCY_INFO_FILE}"`
if [ -d "${legacy_dir}" ]; then
    find "${legacy_dir}" -size 0 | while read -d $'\n' file; do
        rm "$file"
    done
fi

# New build system
if [ -d "${OBJECT_FILE_DIR_normal}" ]; then
    find "${OBJECT_FILE_DIR_normal}" -size 0 | while read -d $'\n' file; do
        rm "$file"
    done
fi

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

คุณต้องเพิ่มสคริปต์นี้สำหรับทุกเป้าหมายของแอปหากคุณมีจำนวนมาก

สคริปต์นี้ใช้เวลา ~ 0.1 วินาทีในการรันและช่วยคุณประหยัดจากการสร้างโปรเจ็กต์ใหม่ทั้งหมด


มันใจดี! จำเป็นต้องมีในทุกโครงการ
Nik Kov


5

เพียงแค่ลบไฟล์นี้โดยเรียกใช้ cmd ในแอปเทอร์มินัลของคุณ:

rm /Users/theodore/Library/Developer/Xcode/DerivedData/Tower-bkpdifuqssebjdgurzmtirbxejnn/Build/Intermediates/Tower.build/Debug/Tower.build/Objects-normal/x86_64/TWRAppDelegate.o


1
ฉันแก้ไขด้วยวิธีเดียวกันเร็วกว่าการทำความสะอาดเต็มรูปแบบ / สร้างในโครงการขนาดใหญ่ของฉัน ครั้งหน้าฉันจะลองใช้วิธีแก้ปัญหาของ @Anton Plebanovich ซึ่งอาจเป็นวิธีที่ยอดเยี่ยมในการแก้ไขปัญหานี้โดยอัตโนมัติ
Romano

3

วิธีแก้ไขข้อผิดพลาดอย่างรวดเร็วโดยไม่ต้องล้างแคช:

  1. เปิดไฟล์ที่อธิบายผิดพลาด (ในกรณีของคำถามนี้TWRAppDelegate)
  2. cmd + A
  3. cmd + X
  4. สร้างใหม่ - ล้มเหลว
  5. cmd + V
  6. สร้างใหม่ - สำเร็จ

1

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

  • ลบไฟล์ (ลบการอ้างอิง)
  • สร้างโครงการ
  • ใส่ไฟล์อีกครั้ง
  • สร้างโครงการ

เวอร์ชันเต็มเพื่อให้คุณไม่มีปัญหาในการค้นหาไฟล์:

  • ค้นหาไฟล์ใน Xcode project navigator
  • คลิกขวาที่ไฟล์แล้วกด "show in finder" (เปิดโปรแกรมค้นหาที่ตำแหน่งที่ไฟล์อยู่)
  • เลือกไฟล์ใน Xcode แล้วกด backspace จากนั้นคลิก "Remove reference"
  • สร้างโครงการ (จะล้มเหลว แต่รอให้เสร็จสิ้น)
  • ใส่ไฟล์อีกครั้งโดยลากจากโปรแกรมค้นหาไปยังตำแหน่งเดียวกับที่คุณเพิ่งลบไป
  • สร้างโครงการ (ควรใช้งานได้แล้ว)

1

คุณสามารถลบไฟล์ TWRAppDelegate.o และสร้างต่อได้ คัดลอกเส้นทางแบบเต็มที่กล่าวถึงในข้อความแสดงข้อผิดพลาดและวางไว้ด้านหลังคำสั่ง 'rm' ในเทอร์มินัลของคุณ ไม่จำเป็นต้องล้าง / สร้างใหม่ลบข้อมูลที่ได้รับเพิ่ม / ลบไฟล์ออกจากโปรเจ็กต์ ฯลฯ


-1

ขั้นตอนที่ 1. ไปที่: โครงการ> สร้างการตั้งค่า> เส้นทางการค้นหา

ขั้นตอนที่ 2. ตั้งค่า "ค้นหาเส้นทางผู้ใช้เสมอ" เป็นใช่

ขั้นตอนที่ 3. สร้างโครงการ (คุณจะได้รับคำเตือน แต่โครงการจะสร้าง)

ขั้นตอนที่ 4. ตั้งค่า "ค้นหาเส้นทางผู้ใช้ทุกครั้ง" กลับเป็นไม่ใช่และสร้างอีกครั้งเพื่อกำจัดคำเตือน


สามารถเพิ่มสิ่งนี้สำหรับผู้อื่นที่พบคำตอบนี้ "ค้นหาเส้นทางผู้ใช้เสมอ" ได้เลิกใช้งานแล้วใน Xcode 8.3 และจากเอกสารยังระบุว่า "ขอแนะนำให้ปิดการใช้งาน" (กล่าวคือตั้งค่าเป็น NO)
Groot

-1

การสร้างใหม่ทั้งหมดไม่ได้เกิดขึ้นในกรณีของฉันดังนั้นฉันจึงอธิบายว่าฉันแก้ปัญหาอย่างไร:
- ลบการอ้างอิงไปยังไฟล์ (อย่าลบไฟล์)
- เพิ่มไฟล์ลงในโปรเจ็กต์อีกครั้งและเรียกใช้


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