2017-02-19 9 views
0

私は共有ライブラリA.soを持っています。関数foo()が定義されています。このfoo()関数は共有ライブラリlibnl-1.soに依存します。関係は以下の通りです。プログラムは2つの競合する共有ライブラリを使用します

A.so 
    { 
     foo() => libnl-1 
    } 

私はプログラムappを持っています。それはfoo()bar()という2つの関数を呼び出します。 bar()にはlibnl、libnl-3の別のバージョンが必要です。関係は以下の通りです:

app { 
     foo() 
     bar() => libnl-3 
    } 

私はcc -o app -lnl-3 -lAを使用してアプリケーションをコンパイルしました。しかし、私は常に私のアプリがクラッシュするのを発見しました。 foo()がlibnl-1の代わりにlibnl-3を呼び出しているようです(私はこれを確認する方法はわかりません)。誰か助けてくれますか?私がこれをやりたいのであれば、どうしたらいいですか?リンク順序を変更しますか?

+0

'$ LD_DEBUG = all。/ app'を使って、ダイナミックリンカがシンボルをプログラムにインポートする場所を調べることができます。 – Sergio

+0

1つのライブラリの2つのバージョンを同時にリンクするのはなぜ良い考えだと思いますか?あなたは本当にあなたがやっていることを考え直す必要があります。そうすれば、ライブラリの1つのバージョン、好ましくは最新のものだけを使用することができます。 –

+0

あなたのケースでは、なぜ答えがhttp://stackoverflow.com/questions/228117/loading-multiple-shared-libraries-with-different-versions?rq=1で役に立たないのですか? (私はちょうどC&Pはあなたが彼らがクローズソースなので、libsから必要な2つの関数を作ることはできません) – deamentiaemundi

答えて

0

もし私がこれをやりたいのであれば、どうすればよいですか? (WindowsのDLLとは異なり)UNIXで

、共有ライブラリは、ない自己完結型のユニットであり、単独では機能しません。 UNIX共有ライブラリの設計は、アーカイブライブラリを可能な限りエミュレートすることです。結果の1つは、(デフォルトで)最初に定義された関数が「勝つ」ということです。あなたのケースでは、libnl-3libnl-1は同じ機能を定義している可能性があります。の最初ののいずれかのライブラリから定義を取得します(これは1回の呼び出しで間違っています)。

リンク順序を変更しますか?

これにより、最初のライブラリが変更され、はまだになります。

だから、となりますか?

は、で、同じライブラリの互換性のないバージョンをリンクすることはできません。 libnl-1またはlibnl-3のいずれかを選択し、と貼り付けます。

あなたは、あなたが、またはbar使用dlopen("libnl-3.so", RTLD_LOCAL|RTLD_LAZY)が必要libnl-3機能をルックアップすることはなく、それを直接使用して-BsymbolicA.soをリンクすることにより、所望の結果を達成することができるかもしれないことができます。

関連する問題