この記事最高! めっちゃわかりやすい。10年前の内容なのに、いまだに同じエラーが発生して同じ手順でトラシューできたりする。神。
「ビルド」という作業は何を指しているのか
https://atmarkit.itmedia.co.jp/ait/articles/1105/23/news128.html
第6回から10個くらい連続で読んだ。神だった。
さっとメモ
- configure
- Makefileを作る
- 環境ごとに Makefileを変えるため。例えば gcc コマンドをintel特有の icc にしたりとか。
- make
- 実行ファイル (command) を作る
- makeナニソレオイシイノ
- a + b を作って a+b にしたいとき便利
- a + c もほしいとき
- cにtouch c すると、a+bは変わらず a+c だけ再コンパイルしてくれる
- make は単純に生成物の コマンド と、要素のファイルの mod timeを比較してるだけ。コマンドより新しいファイルがあったら依存部分を再コンパイルする。
- make install
- Makefileのなかにある
install:
の行を実行してるだけ。実態はとあるパスに makeで作ったコマンドcpしたり、manual filesをcpしたりしてる
- Makefileのなかにある
- make clean
- 作ったcommandや中間物であるところの .o ファイルを削除してきれいにする。もっかい makeすればそれらファイルは再作成される。
- Makefile
- .PHONY:clean ってすると、pwdに clean というファイルが有っても実行できる、ダミー要素。makeはfileを作成するためのものだけど、ただコマンドを実行したいだけのときに使う。
- all:
- 一般的に make内のものを全部まとめて実行するために用意されてる。 make all で実行される。
- macro
- Makefileの中にCC=gcc 書いておくとgccでbuildされる。デフォは gccのsymlinkのcc. CC=echo ってするとただ出力されるだけになったりする
- CC=gcc make でも同じことが起こる
curl の 7.x.x が使いたいんじゃ!!っていうとき
curlが慣習的なbuildができると想定して書く(試してない
wget curl の tarball
tar xzvf
cd
./configure --prefix=/opt/curl-7.x.x/ <------- /optに置くのが監修ぽい。バージョン名指定すると楽。
make
make install
できたら、必ず ldd でlibがリンクされてるか確認する
ldd /opt/curl-x.x.x/bin/curl
curl version的な
condigureでコケる場合
ライブラリが足りない場合
yum search zlib
こんなんで探して、 yum insatll zlib zlib-devel
を入れる。
-develは、こうしてbuildしたいときに使うヘッダファイル。makeするときは必須。
lddに問題ある場合は
LD_LIBRARY_PATH="/opt/curl-x.x.x/lib" /opt/curl-x.x.x/bin/curl
こうするとうまくいったりする
LD_LIBRARY_PATHはコマンドがlibを探すときに参照するパス。
defaultは /usr/lib , /usr/lib64 最近は64の方に大量に入ってる。
libを動的に参照する仕組みがdynamic linkで、ほとんどのコマンド/libがそうなってる
libから始まるのがそれ。
.so は static object だったっけ、なんだったけ
/usr/lib64 な中が symlinkだらけなのは、/usr/lib64でライブラリを共有してるけど、それだとバージョン依存壊れたときにだめじゃん。コマンドごとに違うバージョンどうやって使うの?ってのが、結局複数バージョンの .so を入れて、symlinkを参照するコマンドの数だけおいて、それぞれのコマンドが参照するのを切り替えてる。