Валентин Сильванский (v_silvansky) wrote,
Валентин Сильванский
v_silvansky

Categories:

FLT_EPSILON not found

Наткнулись на интересный баг при сборке под iPhone 5S (arm64): в некоторых местах макрос FLT_EPSILON упорно не находился clang-ом. Начал рисёрчить...

Сначала долго не мог воспроизвести в демо-проекте. Потом один раз удалось - но не надолго: второй билд прошёл успешно. Клин+билд - тоже успешно. Что за ерунда?

Копнул глубже. Начал изучать опции clang при сборке и увидел не знакомые мне флаги:
-fmodules
и
-fmodules-cache-path=~/Library/Developer/Xcode/DerivedData/ModuleCache

Хм! Так ведь это новые экспериментальные опции clang-а! При препроцессинге исходника теперь не подставляется полностью хедер, а генерируется инклюд. К примеру, имеем код:

#include <float.h>
#import <ImageIO/ImageIO.h>

После препроцессинга получаем:

@import Darwin.C.float;
@import ImageIO;


Обратим внимание: если не импортить ImageIO.h, то всё будет работать. Но если импортить сразу сишный и обж-сишные хедеры, то получаем странные сайд-эффекты...

Вывод: если сталкиваетесь с "отсутствием" FLT_EPSILON или чем-то подобным, проверьте, использует ли Ваш проект модули? Если да, то отключите их. Хотя бы до выхода из статуса экспериментальной фичи. К сожалению, для новых проектов Xcode 5 их включает по умолчанию. Но в Build Settings можно без проблем выключить.

Накдиал демо-проект: два таргета, один с модулями, другой - без. Проблему невоспроизведения при повторной сборке решил pre-build скриптом, чистящим кеш модулей.
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments