統計情報(30日間)


最新情報をツイート

人気の投稿

静的ライブラリから特定のファイルを削除する方法(シンボル競合時の一つの方法)

このエントリーをはてなブックマークに追加



例えばあるアプリで2つのライブラリ
 libProprietary.a
 libBitsAndBobs.a
を使っていて両方共内部的に KissXML ライブラリを使用しているとする。

この場合、ビルドするとリンク時に KissXMLのクラス群(DDXMLDocument, DDXMLElement & DDXMLNode)でシンボルの重複エラー(duplicate symbol erros)が発生する。

記事ではこのエラーを回避するために片方のライブラリから KissXMLライブラリを削除する方法を紹介している。

以下手順の概要
1. lipoコマンドでarmv6用のアーカイブファイルを抽出する
$ lipo -thin armv6 libProprietary.a -output libProprietary-armv6.a

2. arコマンドで *.aファイルを展開し、KissXML関係のオブジェクトファイル *.oを削除する
$ mkdir libProprietary-armv6
$ cd libProprietary-armv6
$ ar -x ../libProprietary-armv6.a
$ ls -1
DDXMLDocument.o
DDXMLElement.o
DDXMLElementAdditions.o
DDXMLNode.o
FOOBar.o
__.SYMDEF SORTED
$ rm DDXML*.o

3. libtoolで再び *.aファイルにまとめる
$ libtool  -static *.o -output ../libProprietary-armv6.a
他のアーキテクチャ(i386など)についても 1〜3を行う。

4. 最後に lipoコマンドで*.aにまとめる
lipo -create libProprietary-armv6.a 
 libProprietary-i386.a -output libProprietary-noKissXML.a


関連情報
A-Liaison BLOG: 静的ライブラリ中のシグネチャが衝突してビルドできないときに再ビルドしないでシグネチャを書き換える
こちらはシンボルを書き換える方法。

Leave a Reply