Помилка зв’язувача Xcode: файл замалий для архітектури x86_64


88

Я розробляю додаток у 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)

Хтось знає, що не так?


59
Спробуйте повністю відновити / очистити. Можливо, попередня збірка була аномально перервана, TWRAppDelegate.oфайл залишився пошкодженим або нульовим.
Martin Baulig

5
Невелика точність: ви робите це за допомогою cmd + shift + k, якщо це не працює, перейдіть до папки похідних даних і видаліть папку, названу як ваш проект.
Ramy Al Zuhouri

3
@RamyAlZuhouri: Більше не потрібно самостійно переходити до папок побудови сміття. Утримуючи клавішу Option, і команда Clean (яка знаходиться в меню Product) змінюється на “Clean Build Folder…”, що робить це для вас.
Peter Hosey

Пропозиція Мартіна Бауліга вирішила мою проблему. Дякую!
tbodt

2
@PeterK. Це
приносить

Відповіді:


187

Крадіжка відповіді @ martin-baulig:

Спробуйте повністю відновити / очистити. Можливо, попередня збірка була аномально перервана, а файл TWRAppDelegate.o пошкоджений або нульовий.


7
Нарешті! Ти заслуговуєш на це.
tbodt

Дякую! :-) Ну, відповідь @ martin-bailig у коментарях мені допомогла, але краще б мати її тут як справжню відповідь.
Пітер К.

2
На створення мого проекту потрібно деякий час. Ви можете уникнути видалення лише 1–4 об’єктних файлів, які пошкоджуються, якщо зупинити збірку ненормально, а не все.
Фернандо Мацзон,

20

Зазвичай я додаю пробіл (може бути будь-яким символом з цього приводу) до відповідного файлу, видаляю його та зберігаю. Простіше і швидше, ніж чиста конструкція.


2
Ваша відповідь заощадить мені 10 хвилин відновлення проекту! Дякую
Accid Bright

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 секунди для запуску та позбавляє вас від повного відновлення проекту.


Це геніально! Потрібно мати в кожному проекті.
Нік Ков


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, це може бути чудовим способом автоматизувати це виправлення.
Романо

2

Швидкий спосіб виправити помилку без повного очищення кешу:

  1. Відкрити файл, описаний помилково (у разі цього питання TWRAppDelegate)
  2. cmd + A
  3. cmd + X
  4. Відновити - не вдалося
  5. cmd + V
  6. Відновити - досягти успіху

1

Оскільки побудова чистого проекту може зайняти занадто багато часу, існує коротший шлях для тих, хто має доступ до файлу, який пошкоджений у кеші:

  • Видалити файл (Видалити посилання)
  • Побудувати проект
  • Повторно вставте файл
  • Побудувати проект

Повна версія, щоб у вас не було проблем з пошуком файлу:

  • Знайдіть файл у навігаторі проекту Xcode
  • Клацніть файл правою кнопкою миші та натисніть "показати у пошуку" (відкриває шукач у місці, де знаходиться файл)
  • Виберіть файл у Xcode та натисніть клавішу Backspace, після чого натисніть "Видалити посилання"
  • Створення проекту (він не вдасться, але дочекайтеся його закінчення)
  • Повторно вставте файл, перетягнувши його з пошуку в те саме місце, де ви щойно видалили його
  • Проект побудови (повинен працювати зараз)

1

Ви можете просто видалити файл TWRAppDelegate.o і продовжити збірку. Скопіюйте повний шлях, згаданий у повідомленні про помилку, та вставте його за командою 'rm' у своєму терміналі. Не потрібно чистити / перебудовувати, видаляти похідні дані, додавати / видаляти файл із проекту тощо.


-1

Крок 1. Перейдіть до: Проект> Параметри побудови> Шукати шляхи

Крок 2. Встановіть для параметра «Завжди шукати шляхи користувача» значення «Так»

Крок 3. Створення проекту (Ви отримаєте попередження, але проект буде побудований.)

Крок 4. Встановіть "Завжди шукати користувацькі шляхи" назад на Ні та побудуйте знову, щоб усунути попередження


Можна просто додати це для інших, хто знайде цю відповідь. "Завжди шукати шлях користувача" застаріло станом на Xcode 8.3, і в документі також вказано "Настійно рекомендуємо його відключити". (Тобто встановіть на НІ)
Гроот

-1

Чиста перебудова в моєму випадку не відбулася, тому я пояснюю, як я вирішив проблему:
- Видалено посилання на файл (не видаляти файл)
- Додайте файл до проекту ще раз і запустіть


Негативний голос вимагає пояснень, він спрацював і для мене, і для когось іншого
Девід Сантьяго,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.