2009-10-21 6 views
13

hereの指示に従って、iPhone用の再利用可能な静的ライブラリを作成しています。中古ライブラリのシンボルを自分の静的ライブラリに公開しない

私は内部的にはminizipをライブラリに使用しますが、ユーザーに公開したくありません。

ユーザーは、自分自身、おそらく異なるバージョンを含むことができ、自分の「内部」minizipバージョンとの衝突を引き起こさないようにする必要があります。

これは可能ですか?

編集:

私はminizipファイルに対して追加のコンパイラフラグに-fvisibility=hiddenを追加し、__private_extern____attribute__((visibility("hidden")))する機能を変更しようとしましたが、まだ定義された外部シンボルを生成するようだ:

00000918 T _unzOpen 
0000058e T _unzOpen2 
00001d06 T _unzOpenCurrentFile 
00001d6b T _unzOpenCurrentFile2 
... 

編集#2:

明らかにこれらのXcodeがソースをビルドするときに決して起こらないリンカによってのみ表記されるのは、-cパラメータを追加することです( "ソースファイルをコンパイルまたはアセンブルしますが、リンクしません")。

+0

あなたはミニコピーの内部コピーを変更することができますか?iPhoneはMach-Oの2レベルのシンボル名前空間をサポートしていますか?私は両方への答えがはいと思う。 – ephemient

+0

私は私のコピーを変更してもよろしいですか?たぶん、私は私のライブラリのために使用するプレフィックスの前にすべての記号を付けることができます。私はmy_ をやっても構いません。 iPhoneで2レベルのシンボル名前空間がサポートされているかどうかはわかりません。 –

+1

今後のGoogle社員のために、これが役立つかもしれません。http://stackoverflow.com/a/14863432/311567 – dashesy

答えて

-1

具体的にはSymbol Exporting Strategiesセクションとgcc -exported_symbols_listFILEオプションをご覧ください。Dynamic Library Programming Topics

+1

ダイナミックライブラリ(共有ライブラリ)について議論しているのではなく静的ライブラリよりも? –

+0

OPはシンボルをエクスポートする戦略が適用されない場合の静的ライブラリを扱う –

10

エクスポートされたすべてのシンボルの名前をminizipからobjcopyに変更できます。

objcopy -redefine-sym=minizip.syms yourstaticlibray.a 

minizip.syms

_unzOpen  _yourownprefix_unzOpen 
_unzOpen2 _yourownprefix_unzOpen2 
...   ... 

のようなものはありません衝突に実行可能ファイルは、他のminizip.ayourstaticlibray.aにリンクされている場合、あなたはyourstaticlibray.aへの内側yourstaticlibray.aお電話でのすべてのシンボルの名前を変更しているためminizipは、unzOpenシンボルではなく接頭辞シンボルを使用します。

+0

objdumpはMac OS Xで利用できないようです:/ –

+0

さらに、それは 'objdump'ではなく' objcopy'です...修正します私の答え。 – Nimlar

+0

@JakaJančar$ brew install binutils && gobjdump – FGRibreau

4

静的ライブラリは.oファイルのセット(あなたが言及したように、まだリンクされていない)なので、外部からminizipの存在を完全に隠す唯一の方法は、何とかminizipとライブラリを1つのコンパイル単位としてまとめ、minizip関数/変数を静的にします。

さらにコンパイルするために、ライブラリソースコードを単一の.cファイルに変換する「結合」プロセスをSQLiteがどのように行うのかを見てみることができます。The SQLite Amalgamation

ボーナスとして、より良い最適化が得られます(最近のGCCとBinutilsはリンク時の最適化を行うことができますが、この機能はまだリリースされていません)。

+0

Xcodeツールのリンカは「単一オブジェクトのプリリンク」を行うことができるので、正しい軌道に乗っていますが、単一のコンパイルユニットにマージする必要はありません。 "コンパイルとアーカイブの後で同じ結果を達成する。 http://stackoverflow.com/a/18949281/316487を参照してください。 – bleater

関連する問題