hiro99ma blog

何か技術的なこと

年末 (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 以下にインストールすることを選択した。

< Top page