TweetなうのソースコードがSDK4.0でビルド出来ない問題に対処しました

GitHubに公開しているTweetなうのソースコードがSDK4.0でビルド出来なくなっていましたので対処しました。

Xcode3.2.3でベースSDKを4.0にしてビルドすると以下のようなエラーが発生します。

Undefined symbols:
  "_OBJC_CLASS_$_OAConsumer", referenced from:
      objc-class-ref-to-OAConsumer in XAuthTwitterEngine.o
  "_OBJC_CLASS_$_OARequestParameter", referenced from:
      objc-class-ref-to-OARequestParameter in ExchangeCredentialsOperation.o
  "_OBJC_CLASS_$_OAToken", referenced from:
      objc-class-ref-to-OAToken in XAuthTwitterEngine.o
  "_OBJC_CLASS_$_OAMutableURLRequest", referenced from:
      objc-class-ref-to-OAMutableURLRequest in ExchangeCredentialsOperation.o
      objc-class-ref-to-OAMutableURLRequest in XAuthTwitterEngine.o
  "_OBJC_CLASS_$_OADataFetcher", referenced from:
      objc-class-ref-to-OADataFetcher in ExchangeCredentialsOperation.o

XAuthTwitterEngineが使っているMGTwitterEngine のバージョンを上げたところ解決できました。調べてみるとMGTwitterEngineで変わったところは MGTwitterXMLParser.h と libOAuth.a のみでした。たぶん libOAuth.a に問題があるのだと思います。


そこで、 libOAuth.a の未定義になっているシンボルを nm で調べてみると

古いもの

00000000 A .objc_class_name_OAConsumer
         U _OBJC_CLASS_$_NSObject
000015f8 D _OBJC_CLASS_$_OAConsumer
000015f0 D _OBJC_IVAR_$_OAConsumer.key
000015f4 D _OBJC_IVAR_$_OAConsumer.secret
         U _OBJC_METACLASS_$_NSObject

最新のもの

00000000 A .objc_class_name_OAConsumer
         U _OBJC_CLASS_$_NSObject
00001364 S _OBJC_CLASS_$_OAConsumer
00001464 S _OBJC_IVAR_$_OAConsumer.key
00001460 S _OBJC_IVAR_$_OAConsumer.secret
         U _OBJC_METACLASS_$_NSObject

未定義に成ってしまったシンボルのClassが D(データセクション) から S(bbs) に変わっています。bbsは初期化してない(プログラム起動時に0に初期化される)広域変数の入るセクションですので、データセクションみたいなものだと思うのですが、なぜ未定義になってしまうのでしょうか?