Ошибка квадратных скобок в хедерах UnityFramework в Xcode

Знакомство

Привет!

Я учусь разрабатывать игры на движке Unity. За моей спиной пока что 3 учебных проекта.

Предыстория

Я спокойно себе пилю проект, никого не трогаю, собираю очередную сборку iOS, открываю проект в Xcode и.... на меня обваливается шквал ошибок. Я начинаю пытаться разобраться в том, как исправить ошибку внутри проекта Xcode. Не выходит...

Бегу судорожно откатывать последние изменения в проекте Unity.... Тщетно.Переключаюсь с текущей ветки на ветку main, собираю сборку, понимаю что битва только начинается.

Вернусь немного назад. Когда я получил ошибки в Xcode и пытался понять какие изменения в Untiy могли вызвать их, я заметил, что после сборки проекта Xcode, в консоли Untiy появляются предупреждения о том, что не были найдены какие-то скрипты рендеринга. Предполагаю, что раз не были найдены некие скрипты, то это могло повлиять на проект Xcode. Я не знал, существуют они давно или привнесены последними изменениями. Очень много времени трачу на локализацию проблемы (теперь она, как это часто бывает, выглядит пустяком для меня. И так оно и есть). Сокращая детали и подробную историю, постараюсь изложить коротко. Как оказалось, проблема в том, что изначально я создавал проект URP, чтобы просто посмотреть на него, потыкать, сравнить с неURP. Почему то в этом же проекте я начал делать игру. Позже я удалил часть ассетов URP, но как оказалось не все. И предупреждения, которые появлялись после сборки Unity билда говорили о том, что в проекте нет скриптов, используемые в оставшемся шаблоне URP. Решение простое - удалить шаблоны.

Итак, я проверил коммиты из недалекого прошлого, которые успешно билдились и ошибка не пропала. И только в этот момент битва действительно только началась.

Ныряю рыбкой в гугл.

И происходит то, что в будущем сподвигло меня на публичное описание проблемы и ее решения... Я ничего не нахожу. Даже носители родного языка всех этих сред разработки ни разу не упомянули об этой проблеме. Так что новичкам я точно помогу.

Я находил два поста, в которых описывали как отключить предупреждения. Казалось бы, кейс похожий, но у них всего лишь предупреждения, а у меня ошибка.

Не называя имя главного злодея, его существования и его действий не отменишь. Кажется уже все вокруг меня слышат этот крик, но не души, а подгорающего ... вулкана. Сборка не собирается!

Я естественно воспользовался этими советами, но дальше я уже не мог думать конструктивно, осознанно подходить к решению проблемы, я был на автопилоте. Я просто копал. Смотрел хедеры и настройки фреймворка. Миллион раз гуглил и перечитывал одно и тоже. И даже кажется начал что-то понимать.

Я точно понял, что фреймворк, который делает Unity или по крайней мере хедеры фреймворка - это либо чистый C++, либо он там присутствует в том или ином виде. И я полез в настройки UnityFramework связанные с С++. Исходя из прочитанных статей я понял, что искать надо в Apple Clang - Warnings - C++. Но я, естественно, не особо хорошо понимал, что на что влияет в Xcode, мог только догадываться.

Конец битвы окажется не таким как я ожидал.

На исходе третьего дня я в отчаянии открываю другой свой проект, меняю платформу на iOS, собираю проект Xcode, в этом проекте собираю сборку. Она собирается.... Я сравниваю хедеры фреймворка проекта с ошибками и проекта, который спокойно билдит сборки. Хм, они идентичны по использованию двойных кавычек и угловых скобок. Я расстроен. Но следующая мысль — сравнить настройки фреймворка касаемо С++. Последний день наполнен большим количеством напряженных моментов, от почти каждого действия я жду, что оно окажется решающим. Настройки в двух проектах отличаются. Я меняю два параметра с «Да» на «Нет». Запускаю сборку, готовлюсь смотреть, какие из ошибок пропадут... а может появятся другие?.. прикидываю, что попробовать дальше... и я понимаю, что сижу с лицом выражающим тупое удивление.... я вижу саксесс где сказано что‑то типа: «Невозможно запустить сборку, ваше устройство занято».

Я сижу и не знаю что думать. Уже и забыл что я там последнее разрабатывал в своем проекте. И вроде облегчение, можно дальше пилить свой проект, а не копаться в этом... ИКСкоде. А вроде возмущение, два переключателя с «Да» на «Нет»... три дня. Вместо того чтобы разрабатывать, я бился с ошибками, взявшимися из ниоткуда, а решение — переключить два жалких параметра.

Итак, это все лирика, теперь обратим внимание на техническую часть проблемы.

Проблема

В нескольких места, в хедерах фреймворка появляется ошибка: "double-quoted include [название хедера].h in framework header expected angle-bracketed instead". double-quoted include .h in framework header expected angle-bracketed insteadЕсли пойти на поводу у самонадеянного Xcode, и сменить в указанных им местах двойные кавычки на квадратные(я бы назвал их угловыми) скобки, это вызывает появление противоречивой ошибки, по причине того, что с <> указанные хедеры не находятся. Новая ошибка выглядит так: "'[название хедера].h' file not found with include; use "quotes" instead". '.h' file not found with include; use "quotes" instead

Решение давольно простое: переходим в настройки сборки фреймворка. UnityFramework > Build Settings. Листаем список до Apple Clang - Warnings - C++. И в этом разделе меняем Yes на No для Suspicious Moves, Range-based For Loops.

UnityFramework &gt; Build Settings. Листаем список до Apple Clang - Warnings - C++
UnityFramework > Build Settings. Листаем список до Apple Clang - Warnings - C++

Так же можно на всякий случай отключить предупреждения.

Для этого никуда не уходим из Build Settings. Просто листаем до Apple Clang - Warnings - All languages и меняем Yes на No для Quoted Include In Framework Header.

UnityFramework &gt; Build Settings. Листаем список до Apple Clang - Warnings - All languages
UnityFramework > Build Settings. Листаем список до Apple Clang - Warnings - All languages

Заключение

Возможно, я неправильно что-то понял и описал неверно. Но самое главное - эти действия помогли мне избавиться от проблемы. Теперь я могу дальше спокойно пилить игру и тестировать ее на устройстве.

Это кайф!

Если вдруг кто-то столкнется с этим, не хочу чтобы этот человек потратил 3 дня или вообще не смог решить проблему. Я был бы рад преодолеть ее не за 3 дня, а за 10 минут, загуглив и переключив два - три параметра в настройках.

11
1 комментарий

Небольшой совет: когда описываете проблему, также добавляйте описание вашего окружения. А именно: версия Unity, версия ОС, версия Xcode, целевая платформа и список всех подключенных сторонних SDK. Без этой информации локализовать проблему практически невозможно. + очень многие проблемы характерны для конкретной версии (кстати, по этой причине, в компании, где я работал использовали только LTS версии, а обновление на новую требовало несколько недель тестирования).
Ну и все исправления настроек Xcode заносите в скрипты с методами, помеченными атрибутом [PostProcessBuildAttribute] чтобы вам не пришлось все править руками каждый раз, когда хотите новый билд сделать