2009-05-06 9 views
32

Debian Linuxシステムでlibcurlを使うコードをコンパイルしています。私の開発マシンではDebian 5が稼働していますが、古いDebian 4システムでもバイナリを使えるようにしたいのです。私は-lcurlを指定した場合、それはlibcurl.so.4にリンクしますが、Debianの4つのシステムのみlibcurl.so.3GCCの共有ライブラリの特定のバージョンにリンクするには

を持っていることがわかり

は、私はどちらかにリンクするGCCを伝えることができるいくつかの方法がありますlibcurl.so.3(Debian 4と5の両方に存在します)またはlibcurl.soだけなので、利用可能なバージョンは何でも使用できますか?

+1

古いDebianでは、libcurl.so.3へのシンボリックリンクはlibcurl.soではありませんか?つまり、デフォルトでは、-lcurlは正しいことではないというのは奇妙に見えます。 –

+0

kastauyra:バージョンはバイナリ互換ではない、または少なくともバイナリ互換性があるとみなすことはできません。したがってリンクすると、バイナリでリンクされたメジャーバージョンが記録されます。新しいシステムでコンパイルすると、バージョン4が必要になり、古いシステムでは動作しません。 (実際には何が記録されているのかは、ライブラリファイルに格納されている文字列であり、通常は「libcurl.so.3」である必要はありません) –

答えて

22

リンカのコマンドラインに-lの代わりに実際の.soファイルを渡すことができます。これは、必要な処理を行う必要があります。

+1

ああ、libcurl.soは単なるシンボリックリンクDebian上のlubcurl.so.4にあります。したがってlibcurl.so.4にリンクしています。 –

+0

私はDebian 5のlibcurlにはそれほど適していませんが、これを受け入れられた答えとしてマークします。私がやったのは、Debian 4システムからlibcurl.so.3のコピーを取得して、それを直接指定することです。 bdonlanのようにファイル名が示唆されました。 –

1

あなたのプロジェクトにローカルで.3にリンクするシンボリックリンクを作成すると、コンパイル時に-Lだけ使用できます。あなたが名前の衝突を起こすかどうかは分かりませんが、場合によってはlibcurl-old.soと呼ぶこともできます。

53

代わりの「-lcurl」使用「-l:libcurl.so.3」を使用して そしてofcourseのも

+0

シンボリックリンクしているときも同じ問題が発生します。 -l:libX.soがlibX.so.Yにリンクしています – Gregory

+1

これはrpathでさえ私にとってはうまくいきません。 lddはそれが1つのものとリンクしていることを示します。リンクされた出力には正しいファイル名が表示されます。しかし、straceはfile.2.3の代わりにfile.2をロードしていることを確認しています。シンボリックリンクではありません。 – jgmjgm

+0

私はこれを答えとしてマークしたいと思っています。あなたは本当に私のsay @ engineer.udaysを保存しました – user5241806

0

を「-L _installed_pa​​th_」を使用し、私はそれを行うための正しい方法は--filterを使用するようになると思いますリンカーの--auxiliaryフラグ。

これらはあまり詳しく書かれていませんが、インストールされているマシンに応じて同じライブラリの異なるバージョンからシンボルを読み込むことができます。

関連する問題