2012-04-05 17 views
4

C++の忍者ブードゥーの手袋を着用してください。コンパイルされた静的ライブラリの変更

iOSアプリで使用するサードパーティライブラリを購入しました。そのライブラリには2つのバージョンがありますので、bull_frog_noises.atoad_frog_noises.aとしましょう。

会社は、誰かが両方カエルノイズ単一アプリを作りたいだろうと想像もしなかったので、各ライブラリは同じメソッド名提供しています:

MAKE_FROG_NOISE(); 

をする方法がありますこれらのライブラリを再構築または変更して、両方を互いに衝突させずに使用できるようにしますか?ここは理想的な状態である:

MAKE_BULL_FROG_NOISE(); 
MAKE_TOAD_FROG_NOISE(); 
+4

iosでlibを動的に読み込むことはできません。アップルの承認プロセスを経ることなく、アプリにさらなる機能を与えることができないように、それらはアプリと共にコンパイルされています。 –

+0

Raphaelさん、ありがとうございました - 私は人々にダイナミックローディングのアイデアに巻き込まれたくないので、その部分を削除しました。 – bendytree

答えて

4

私は16進エディタを使って、MAKE_FROG_NOISEのすべてのインスタンスがMAKE_TOAD_NOISEに置き換えられるように、それらのライブラリの1つを手動で変更しようとします。そのことだけを変えることには非常に注意しなければなりません。バイトを置き換えることができます。挿入したり削除したりしないでください。ファイル内の他のものは変更しないでください。

+0

これはうまくいきましたが、それは面倒です。使用するメソッドの名前を変更し、相互に衝突する場合に使用するプライベートメソッドを変更します。とにかく、私は 'Hex Fiend'を使ってそれぞれの手紙の名前を変更しました。 – bendytree

3

あなたが欲しいメソッド名を持つこれらのライブラリへのラッパーとして他の静的ライブラリを構築し、プロジェクトでラッパーライブラリを含めることができます。 - bull_frog_noises_wrapper.aという名前の新しい静的ライブラリプロジェクトを作成します

1:このような

2 - この新しく作成されたライブラリへの依存としてbull_frog_noises.aを含めます。

3を - このようなメソッドを作成します - :

void MAKE_TOAD_FROG_NOISE() 
{ 
    MAKE_FROG_NOISE(); 
} 

5 - プロジェクトでそれらのラッパーを追加し、あなたのようなメソッドを作成し、toad_frog_noises.aために同じことを行い

void MAKE_BULL_FROG_NOISE() 
{ 
    MAKE_FROG_NOISE(); 
} 

4やり直し

メインプロジェクトで使用するヘッダーファイルに注意して、内部ライブラリと競合しないようにしてください。

希望します。

+0

これは、ライブラリの内部動作がお互いに踏み外されることを防ぎますか?たとえば、 'MAKE_FROG_NOISE()'の両方のメソッドが 'PREPARE_NOISE()'のようなメソッドを呼び出した場合はどうでしょうか?正しいメソッドが呼び出されますか? – bendytree

+1

これは問題を解決しません。すべてをリンクする必要があり、衝突が発生します。 –

+1

だから私は2つの別々のライブラリを作成するように指示した。各図書館は独立して建設されます。 toad_frog_noises.aには、toad_frog_noises_wrapper.aにのみ含まれるヘッダーのセットが含まれ、他のライブラリーは同じことを行います。メソッドのリンク部分は、プロジェクト自体ではなく、ラッパーライブラリで発生します。 –

関連する問題