メインドライブ(/usr
、/usr/local
などを含む)にストレージスペースがほとんどない仮想マシン(CentOS 5.3)を使用しています。ほとんどのストレージスペースは、/mnt
にマウントされている別のドライブで利用できます。したがって、このドライブに基本的なインストールディレクトリ(bin
、include
、lib
などのサブディレクトリを含む)を作成し、そこにライブラリをインストールしました。
[standage@vm142-46 ~]$ ls -lhp /mnt/lib
total 33M
-rw-r--r-- 1 standage iplant-everyone 21M Dec 21 16:29 libgenometools.a
-rwxr-xr-x 1 standage iplant-everyone 13M Dec 21 16:29 libgenometools.so
次に、自分が作成したコードを使用してそのライブラリにリンクしようとしましたが、次のメッセージが表示されました。
/usr/bin/ld: cannot find -lgenometools
作成した新しいインストールディレクトリでldconfig
を更新していないことに気付いたので、先に進んで/mnt/lib
を/etc/ld.so.conf
に追加し、/sbin/ldconfig
を実行しました。ただし、コードを再度リンクしようとすると、同じエラーが発生しました。
最終的に、/usr/local/lib64
...へのシンボリックリンクを作成することで、ライブラリをリンクさせることができました。
[standage@vm142-46 ~]$ Sudo ln -s /mnt/lib/libgenometools.a /usr/local/lib64
[standage@vm142-46 ~]$ Sudo ln -s /mnt/lib/libgenometools.so /usr/local/lib64
...しかし、これは私の元の問題を実際には解決しません。それは単なるダクトテープの解決策です。最初に何を間違えたのですか?インストールしたライブラリにリンクするにはどうすればよいですか?
/etc/ld.so.conf
は、動的リンカー、つまり実行時にライブラリが検索される場所にのみ影響します。実行可能ファイルをビルドするときに重要なのは、ld
がライブラリを探すパスです。これらを指定する通常の方法は、-L
オプションを渡すことです。ほとんどのconfigure
スクリプトには、追加の-L
オプションを渡す方法があります。通常、ld
のデフォルトの検索パスを変更する方法はありません。 gcc仕様ファイルの変更を検討するかもしれませんが、それには/usr
の下ではなく/etc
の下のファイルを変更する必要があります。
少し厄介な設定を考えると、/mnt
の/usr
の ユニオンマウント を調べたい場合があります。 CentOSが提供するユニオンマウントの可能性があればわかりません(もちろん、ネイティブまたはFuseベースのサードパーティオプションがあります)。
ldconfig -v
を使用して、ldconfigが新しいライブラリを認識しているかどうかを確認できます。そのメッセージ/usr/bin/ld: cannot find -lgenometools
は、コンパイルプログラムのリンク段階にあると思いませんか。次に、-L/mnt/lib
パラメータを使用してライブラリを見つける可能性のあるリンカに言う必要があります。