年末 (1)
2024/12/26
はじめに
年末なので C言語で昔作ったプログラムの改修をすることにした。
来年になったら勉強を兼ねて一から作り直したいと思うが、その気力があるかどうかわからん。
コードを公開しないので、作業中に出てきた問題や理解していなかったことをメモがてら記録していく。
/usr/local/lib にインストールすべき?
ライブラリをインストールする必要があった。
apt install
でも取得できたと思うが、GitHub にリポジトリがあるのでビルドすることにした。
ありがちな autogen.sh
して configure
して make install
するタイプだった。
デフォルトで configure
するとインストール先が /usr/local/lib
になるので sudo make install
になる。
ふと思ったのだが、これは素直に /usr/local/lib
にコピーさせて良いのだろうか?
長年同じ開発環境を使っていると「あら、既にライブラリがインストールされていたわ」ということがしばしばある。
助かる反面、いつインストールしたのかわからないし、ディスクの容量を増やしたくて削除しようとしてもやってよいのかどうかわからない。
ただ、共有ライブラリはパスが通るなり LD_LIBRARY_PATH
に追加するなりしないといけないんじゃなかったか?
それで後になってわからなくなるくらいなら /usr/local/lib
にコピーしておいた方が無難だとも思う。
悩ましい。。。
LD_LIBRARY_PATH
LD_LIBRARY_PATH
は今も使われているのだろうか?
あるいは、別の方法が推奨されていたりしないだろうか?
ChatGPT氏に訊いてみる。
具体例: 優先順序
実行ファイルに埋め込まれたRPATH/RUNPATH。
環境変数LD_LIBRARY_PATH。
/etc/ld.so.confやそのインクルードファイルで指定されたディレクトリ。
/etc/ld.so.cacheにキャッシュされているパス。
必要に応じて標準パス(/lib, /usr/lib, /lib64, /usr/lib64)やカレントディレクトリ。
現在どうなっているかの確認方法も出力されていた。
ldd
で実行ファイルが依存しているライブラリを出力してくれるそうだ。
また ` /etc/ld.so.conf.d/libc.conf に
/usr/local/lib` が入っていた。
$ cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf
$ ls /etc/ld.so.conf.d/
fakeroot-x86_64-linux-gnu.conf libc.conf nrftools.conf
ld.wsl.conf nrfjprog.conf x86_64-linux-gnu.conf
LD_LIBRARY_PATH
を使うのは今でも有効だということはわかった。
そこに書かないならカレントディレクトリに置くなりなんなりというところか。
include の検索
まだビルドしてインストールする前なので今ならどうとでもできるのだが、ではどうするとよいか。
/usr/local/lib
直下に展開するとファイルがドバッと広がってしまうので嫌だ。
ならば、その中にディレクトリを作って、/etc/ld.so.conf.d/
にそれ用の conf ファイルを置くとするか。
忘れていたが、ライブラリだけあればよいというわけではなかった。
ヘッダファイルがいるのだが、それもシステムとして検索してくれないと面倒だ。
ここまで来ると素直に sudo make install
した方が楽なのかもしれないが、確認しておこう。
面倒なので今回も ChatGPT氏に頼る。
#include <file.h>の場合
1. ユーザー指定のヘッダーパス (-Iオプションで指定されたディレクトリ)
#include <file.h> の場合は、現在のディレクトリは検索されません。
-I オプションで指定されたディレクトリが最初に検索されます。
2. システムの標準インクルードパス
/usr/include や /usr/local/include など、システムが提供する標準的な場所。
現在の確認方法も載っていた。
$ gcc -v -xc -E /dev/null
Using built-in specs.
COLLECT_GCC=gcc
...
#include <...> search starts here:
/usr/lib/gcc/x86_64-linux-gnu/11/include
/usr/local/include
/usr/include/x86_64-linux-gnu
/usr/include
End of search list.
...
configure
の --prefix
がデフォルトで /usr/local
なので include ファイルも /usr/local/include
にコピーされるのだろう。
システムのインクルードパスを追加するのは gcc -i<dir>
と小文字の方じゃなかったっけ?
-I などとセットで説明されていたが -isystem
は -I
と同じで "file"
も <file>
も検索するそうだ。
なら -I
だけでいいか。
いや、そうではない。
/usr/local/lib/<dir>
は設定を追加しておけば自動で見てくれるようだが、include には関係が無い。
C_INCLUDE_PATH
もあるようだが、それは面倒だから却下だ。
おわりに
私は・・・ sudo make install
で /usr/local
以下にインストールすることを選択した。