実行時にプログラムによって異なる(互換性のない)ライブラリをリンクする方法は?

実行時にプログラムによって異なる(互換性のない)ライブラリをリンクする方法は?

特定の(しばしば競合する)ライブラリにコンパイルする必要がある従来のコードがたくさんあります。具体的には、 でのみコンパイルできるプログラムと、 でのみg77使用できるプログラムがありますgfortran

最初のプログラムを呼び出そうマケイそして第二番組UVES_popler

コンパイル(および実行)するときは両方ともリンクする必要があります。これは対応するコンパイラでコンパイルされます。だから、コンパイルマケイg77で実行する必要がありますg77これもまとめました。そしてそれぞれ同じです。UVES_poplerそしてgfortran

g77とgfortranを使ってpgplotをコンパイルできると仮定すると、bashrcを設定するベストプラクティスは何ですか?各プログラムに対してbash機能を作成し、正しいリンクとLD_LIBRARY_PATHsを持つ必要がありますか?それは次のとおりです。

runmakee() {
  export LD_LIBRARY_PATH=/path/to/g77-pgplot/
  makee
}

そして(おそらく関連があるかもしれませんが)、これらのプログラムが別々にコンパイルされたときに正しいライブラリが呼び出されるようにMakefileにフラグを設定する方法はありますか?

ベストアンサー1

Bash機能は機能するはずですが、「一般的な」アプローチは、各実行可能ファイルのラッパースクリプトを作成し、その中に設定する必要があるすべての項目を設定することです。 (たとえば、実行可能ファイルの名前を変更し、foo.binより簡単に呼び出すためにラッパースクリプトを呼び出すことができますfoo。)

ELFターゲットの場合(他のオブジェクトタイプは不明です)、-rpathリンカオプションを設定して実行可能ファイルからランタイムライブラリの検索パスを直接ハードコードすることもできます。 gcc(Cコード用)を使用すると、最終接続手順は次のようになります。

gcc ... -Wl,-rpath,/your/hardcoded/path ...

Fortranコンパイラにも同様のオプションがあるか、リンカオプションを直接変更できるとします(この場合はオプション-rpath /your/path)。

おすすめ記事