2009-06-10 9 views
0

私が取り組んでいるプログラムは、3rdPartyLibrary.libに静的にリンクされています。Linux用のコードで異なるバージョンのライブラリを混在させる

同じ3rdPartyLibraryの新しいバージョン、たとえば3rdPartyLibraryNewVersion.libを利用したかったのです。

したがって、動的にリンクされたライブラリとして3rdPartyLibraryNewVersion.soをインクルードし、wrapper.soというラッパーダイナミックライブラリを使用してインクルードします。 3rdPartyLibraryの新バージョンと旧バージョンの両方を同時に使用することを望んでいますが、プログラムの別のパーティで使用しています。

私たちが持っている解決策は、古い3rdPartyLibraryを静的にリンクし、同時に3rdPartyLibraryNewVersionにラッパーライブラリに動的にリンクすることです。

プログラム---静的にリンク---> 3rdPartyLibrary.lib。 ---動的リンク - >ラッパー.so ---動的リンク---> 3rdPartyLibraryNewVersion.so。

これは可能ですか?

私たちが遭遇した問題は、wrapper.soがテスト実行ファイルで動作していたのに対し、3rdPartyLibrary.libに静的にリンクされているプログラムからラッパーが呼び出されたときに3rdPartyLibraryNewVersion.so内で失敗したことです。

私は間違っていましたか?

私はそれが失敗した どのようあなたが言及するのを怠っ...正しい方法は3rdPartyLibrary.libに我々のコードを更新することですが、それはあまりにも退屈である

おかげで、

ティム

答えて

0

を知っていますあなたのラッパースキームを使用して...

しかし、あなたはおそらく物事が失敗するか予期しない方法で動作する名前空間の衝突にぶつかるでしょう。

あなたは正しいことを知っています:あなたのコードを更新してください。あまりに面倒なら、あなたのコードは努力する価値がありません。新しい機能を使用してコードを作成する必要がある場合は、更新する価値があります。 最後のあなたが今、同じライブラリの2つの異なる互換性のないバージョンに結びついている状況を作りたいと思っています。後でそれを維持する必要がある場合は、あなた自身を蹴るでしょう。他の誰かがそれを維持しなければならないなら、彼らはあなたを狩り、あなたを打ち負かすでしょう。それは正しい方法です。

+0

私は滑りやすい道を行くと知っていますが、別の道は簡単ではありません。 いずれの場合でも、プログラムのコアファイルは、gdbによると3rdPartyLibraryNewVersion.so内でプログラムがクラッシュしたことを示していました。 SIGSEGVが送信される前に、ThirdPartyLibraryNewVersion内のいくつかの内部呼び出しが行われました。 名前空間の衝突について詳しく説明できますか。 リンクされているラッパーライブラリーは3rdPartyLibraryNewVersionを呼び出します(または私が思う)、プログラムが混乱し、静的にリンクされたライブラリーと呼ばれることを意味しますか? –