2013年10月29日火曜日

arch already exists in fat dylib

タイトルのエラーが突然出てきた。
CleanしてもBuildしても出てくる。なんだこれは。
とりあえずググるといつもの通りのStack over flowの記事がヒット。

http://stackoverflow.com/questions/18392902/arch-already-exists-in-fat-dylib-in-build-log

以下意訳。
「いきなり "arch already exists in fat dylib" とかすごい勢いでビルドログに出力されて困ってるんですけどどうしたらいいですか?」
「ろくな情報もねえのに分かるかよ。こんなもんオフトピだ」

で即クローズされてる。もうちょっと優しくしてあげてよ…。

自分はAppCode使ってるので、ちょっとXcodeでビルドしてみるかーと思ってやってみたら、バックグラウンド処理を動かそうと思って書いた以下のコードで "Initializer element is not a compile-time constant" というエラーが。
static UIBackgroundTaskIdentifier bgTask = UIBackgroundTaskInvalid;
この "UIBackgroundTaskInvalid" だけど、定義はこうなっている。
typedef NSUInteger UIBackgroundTaskIdentifier;
UIKIT_EXTERN const UIBackgroundTaskIdentifier UIBackgroundTaskInvalid  NS_AVAILABLE_IOS(4_0);
つまり、バージョンが決まらないと定義が決まらないので、この定数っぽいシンボルは実は実行時でないと実際に参照出来ないわけだ。エラー内容もそういう内容。

というわけでこれを直してAppCodeでビルドしてみると、タイトルのエラーも無くなり一件落着。

これはあれか、コード解析処理でなんか変な事になってるって事なのかな…。
最初に出したSOFのURLの人も、jenkinsでビルドしてて出たって言ってるので、サードパーティ環境でのみ出るのかもしれない。

日本語の記事が一つも引っかからなかったのでここに記す。
これ気付かないとドはまりする案件だと思うので皆さん気を付けて下さい。