2014-01-09 12 views
6

自分のプログラムを自分のコンピュータにインストールしています(libtiff.so -> libtiff.so.5)。 そして、libtiff.so -> libtiff.so.4という別のマシンでビルドをプッシュします。古いバージョンの共有ライブラリにリンクするにはどうすればいいですか

実行時に、私のプログラムが存在します:«共有ライブラリをロード中にエラー:libtiff.so.5:共有オブジェクトファイルを開くことができません:そのようなファイルまたはディレクトリ»。

私は他のマシンをアップグレードできません。実行中のマシンと同じバージョンの仮想マシンでコンパイルしないようにしたいと思います。したがって、コンパイラにlibtiff.so.5の代わりにlibtiff.so.4を使用させたいと思います。

私はを(libtiff.so.5と同様に)私のコンピュータにインストールしています。新しいバージョンではなく、どうすればこのバージョンと連携させることができますか?私はlibtiff.so -> libtiff.so.4を動かすことを考えましたが、最新のバージョンが必要な場合は私のシステムを壊すのを恐れています(apt-get purge libtiff5は他のパッケージが必要なのでエラーが出ます)。

古いバージョンのライブラリとリンクすることはできますか?はいの場合、どうですか? libtiff.soのシンボリックリンクを古いバージョンに変更することは危険ですか?そうでない場合は、私の問題を解決するでしょうか?

+0

[LD_PRELOAD](http://en.wikipedia.org/wiki/Dynamic_linker)を使用してください。 – jml

+0

リンクするときに通常の '-ltiff'の代わりに.so.4への絶対パスを使うのはどうですか? (libtiff4互換のヘッダをコンパイルする必要があります)。 –

+0

コンパイラは共有ライブラリの場所を見つけることができません。私はPATHも渡す必要があると思います。 –

答えて

2

あなたは、ライブラリの特定のバージョンにリンクするために、この構文を使用することができます。

 
gcc [other options] -l:libtiff.so.4 

パスを指定する必要はありません。ライブラリを見つけるために通常のディレクトリが検索されます。

注:マイケル・ワイルドに言及したように、最新バージョンではなく、そのバージョンのヘッダー・ファイルをインストールする必要があります。

+0

この機能の文書化先を指摘できますか?どういうわけか、私は 'gcc'のドキュメントからそれを見つけられませんでした。 – cmaster

+0

@ cmasterこれはリンカー( 'man ld')に書かれています。 '-l'オプションを探します。 –

+0

ああ、それを見つけた。ありがとう。 – cmaster

0

-ltiffの代わりに.so:への絶対パスをリンカーに指定します。/lib64/libtiff.so.4をリンカーに指定します。

1

他にも言及したように、完全なバージョン名、または絶対パスを指定することによってリンカーを強制することができます。

しかし、そうすることを強くお勧めします。問題は、インストールされたヘッダーが新しいバージョンのライブラリに対応していることです。これらのライブラリバージョン間でAPI/ABIの変更点が変更された場合、プログラムが動作したり、断続的にクラッシュしたり、運が良ければ動作しない可能性があります。

代わりに、libtiff.so.4ライブラリに対応する開発パッケージを一時的にインストールする必要があります。 Debian/Ubuntuなどの場合、これはlibtiff4-devパッケージになります。

関連する問題