2013-02-11 21 views
8

私は共有ライブラリ(C++)とこのライブラリを使用するpythonモジュールを配布しています。 Bullet Physics Library(CMakeサブプロジェクトとして)の修正バージョンをビルドします。 私はbulletクラスと関数を1つのファイル(bullet_interface.cpp)でしか使用しません。すべてのBulletは "namespace {...}"の中に隠されています。共有ライブラリ名の衝突

問題は、他のいくつかのライブラリではシステムの依存関係としてBulletが必要であり、システムバージョンのBulletにリンクする必要があるということです。実際、私のライブラリ(libopenrave)の依存関係の1つは、Bulletシンボルをエクスポートします。 (具体的には、Bulletシンボルをエクスポートするプラグインを動的にロードすることがあります)。

bullet_interface.cppが正しいBullet関数を使用するようにライブラリを構築する方法があるのでしょうか?私のライブラリはBulletシンボルを表示しません。 ソースコードに変更を加えなければならないので、システムの箇条書きを使用することはできません。 ハッキングの解決策の1つは、検索と置換(ほとんどすべてが文字列 "bt"を含む)を使用して、すべてのBullet関数とクラスの名前を変更することです。より良い方法がありますか?

+1

明白な解決策は、修正プログラムをメインの 'Bullet'ライブラリに入れて、THATをシステムライブラリとして使用することです。 –

+0

変更されたバージョンが最初に読み込まれ、他のライブラリのすべての依存関係を満たしているので、システムを必要としませんか? –

+1

libopenraveは弾丸シンボルとリンクを弾丸ライブラリにエクスポートしますが、あなたのプラグインは全く同じ箇条書きシンボルを使用し、変更された箇条書きライブラリに同梱されていますか?その場合は、修正された箇条書きのライブラリを静的なライブラリとしてビルドし、プラグインにリンクし、プラグインのすべての記号が隠れていることを確認してください。あなたのプラグインコードはそれらを使用しますが、動的シンボルテーブルにはエクスポートされません。 bulletのmakefileやコード属性が明示的に可視性を設定している場合は、ハッキングする必要があります。オブジェクトをリンクする前にbinutilsを使ってシンボルの可視性を変更する必要がありますか? –

答えて

2

これは、あなたが望むものを達成するための少しラウンドアバウトの方法ですが、箇条書きコードで検索と置換を打ち負かします。

あなたはこのようobjcopyユーティリティを使用して弾丸ライブラリ内のシンボルの接頭辞 "試すことができます。

objcopy --prefix-symbols=old_ bullet.a 

このだけでなく、動的ライブラリで動作するはずですが、あなたはそれを試す必要があるでしょうが。詳細は、this answerを参照してください。