?

Log in

FLT_EPSILON not found - ещё о [entries|archive|friends|userinfo]
Валентин Сильванский

[ website | аккорды АукцЫона ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

FLT_EPSILON not found [Feb. 25th, 2014|04:24 pm]
Валентин Сильванский
[Current Music |Electric Light Orchestra - From The Sun To The World (Boogie #1) | Powered by Last.fm]

Наткнулись на интересный баг при сборке под 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 скриптом, чистящим кеш модулей.
LinkReply