Ошибка компоновщика 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)

Кто-нибудь знает в чем дело?

tbodt
источник
59
Попробуйте полную перестройку / очистку. Возможно, предыдущая сборка была аварийно прервана, оставив TWRAppDelegate.oфайл поврежденным или нулевым размером.
Мартин Баулиг
5
Небольшая уточнение: вы делаете это с помощью cmd + shift + k, если это не сработает, перейдите в папку производных данных и удалите папку с именем вашего проекта.
Ramy Al Zuhouri
3
@RamyAlZuhouri: Больше не нужно самому перемещать папки сборки в корзину. Удерживая нажатой кнопку Option, команда «Очистить» (которая находится в меню «Продукт») изменится на «Очистить папку сборки…», что сделает это за вас.
Питер Хози
Предложение Мартина Баулига решило мою проблему. Благодарность!
tbodt
2
@PeterK. Это приносит мне серебряный значок "Хороший вопрос" :-)
tbodt

Ответы:

186

Кража ответа @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 секунды и избавляет вас от полной перестройки проекта.

Антон Плебанович
источник
Это гениально! Нужно иметь в каждом проекте.
Ник Ков
7

rm -rf /Users/hostname/Library/Developer/Xcode/DerivedData

yeyimilk
источник
5

просто удалите этот файл, запустив cmd в приложении терминала:

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

Haithngn
источник
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, и в документации также говорится: «Настоятельно рекомендуется отключить его». (То есть установка NO)
Groot
-1

В моем случае чистой перестройки не было, поэтому я объясню, как я решил проблему:
- Удалена ссылка на файл (не удаляйте файл)
- Снова добавьте файл в проект и запустите

Дэвид Сантьяго
источник
Голосование против требует объяснения, это сработало для меня и могло сработать для кого угодно
Дэвид Сантьяго,