- 締切済み
MakefileのLDLIBSとLOADLIBESの違いについて
どうもこんにちは 趣味でプログラムを作っています。 make コマンドを使ってコンパイルしているのですが、Makefile のマクロ(変数?)でちょっとわからないものがあります。 最初から用意されているマクロで、LDLIBSとLOADLIBESというものがありますが、これらはどのように使用するのでしょうか? webで調べてみると、リンクするライブラリのパスを指定するマクロのようですが、両者の違いがよくわかりません。 どちらかを適当に選んで使えばいいのでしょうか? それとも、まったくの別物でしょうか?
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- don_go
- ベストアンサー率31% (336/1059)
>その際に使用されている LOADLIBES や LDLIBS には何を >指定するのかわかりませんでした。 ANo.1で回答した通り >LDLIBS と LOADLIBES のどちらを使用するか、また別の変数を >使うかは自由です。 >#多数のプログラムを同時にコンパイルする場合でリンクする >#ライブラリがプログラムによって異なる場合は、LDLIBS2等 >#追加する事も可能です。 従って、LOADLIBES と LDLIBS を共に使用しても何も問題は 有りません。 どうして、そうなるのか理由を理解した上で使用しないと 1文字違うだけで何も対処できなくなってしまいます。 WEB検索で見つけた例だけにこだわらない様に注意しましょう。
- don_go
- ベストアンサー率31% (336/1059)
>CC や CFLAGS といったデフォルトのマクロのつもりで書いてました。 CC もCFLAGS も LDLIBSやLOADLIBESと同じく暗黙のルールと して慣用的に使用されているもので、他の値に変えても実行 可能なので「デフォルト」とは言い難いのですが... >その際に使用されている LOADLIBES や LDLIBS には何を >指定するのかわかりませんでした。 標準ライブラリ以外のライブラリの追加指定に使用します。 例) -lm :libm.a(GNU C用数値演算ライブラリ)を追加参照 他にもグラフィックライブラリ、データベース、機器制御用 等様々なライブラリ(自作ライブラリ含む)との組合せにより 他の言語にない程の機能拡張が可能になります。
お礼
回答ありがとうございます。 「特に指定していなかった場合に使用される値」という意味でデフォルトと表現していました。 語弊のある表現だったかもしれません。すいません。 ちなみに make の内部データベースには以下のように記述されていました。 一部抜き出します。 # デフォルト LINK.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) # デフォルト LINK.o = $(CC) $(LDFLAGS) $(TARGET_ARCH) # ターゲットではありません: .o: # 暗黙ルールの探索は行われませんでした. # 修正時刻がチェックされることはありません. # ファイルは更新されていません. # 実行するコマンド (ビルトイン): $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@ もっと詳細に書くと、sample.c を作成し、 all: sample という文をMakefile に記述し、 特にコマンドが指定されていなかった場合に使用されるルールを使用し、コンパイルしようと考えてます。 今は、CFLAGS には -Wall や -O2 を指定してます。 (例えば CFLAGS := -Wall -O2 -Werror) 必要なライブラリをリンクするために -lm や、他の自作のライブラリを追加するオプションを指定していますが、それらは今は LDLIBS に指定しています。 (例えば LDLIBS := -lm $(MY_LIBRARY) ) これは web に LDLIBS にはライブラリを指定すると記述してある例があったため、それを参考にしました。 そして、端末から、 make -p を実行し、make で使用されているルールを見たところ、LDLIBS だけでなく、LOADLIBES も指定されていました。 ($(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@ など) 改めて web で検索したところ、LOADLIBES にライブラリを指定している例も見つけました。 使用するライブラリは、LDLIBS と LOADLIBES どちらに指定しても問題なく動くように見えましたが、それ以上は調べてみてもどちらに指定するべきかわかりませんでした。 LDLIBS と LOADLIBES に違いはあるのでしょうか? (例えば、LDLIBS には標準のライブラリを記述し、LOADLIBES には自作のライブラリを指定する など) 慣例的、歴史的にどのような記述をするのが望ましいのかわかりませんでした。 (all: sample でなくても、 maker: sample でも create001: sample でも実行ファイルが作成できるが、一般的には all が使用されるなど。)
- don_go
- ベストアンサー率31% (336/1059)
LDLIBSもLOADLIBESも最初から用意されているマクロでは ありません。 一般的にはリンクするライブラリの記述に使用されるマクロ 変数です。 通常はMakefile内で LDLIBS = -lm または LOADLIBES = -lm の様に明記しますが、予め環境変数に設定しておけば省略が 可能です。 LDLIBS と LOADLIBE のどちらを使用するか、また別の変数を 使うかは自由です。 #多数のプログラムを同時にコンパイルする場合でリンクする #ライブラリがプログラムによって異なる場合は、LDLIBS2等 #追加する事も可能です。
お礼
回答ありがとうございます。 最初から用意されている、という表現は少々語弊があったかもしれません。 CC や CFLAGS といったデフォルトのマクロのつもりで書いてました。 暗黙のルールの検索で、例えば $(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@ このようなコマンドが実行されることがあり、 その際に使用されている LOADLIBES や LDLIBS には何を指定するのかわかりませんでした。
お礼
回答ありがとうございます。 なぜ Makefile の暗黙ルールで、LOADLIBES と LDLIBS という、同様の機能を表現する(ように見える)記述が2つあるのか、歴史的(政治的?)背景を知りたかったのですが。。。 これは他の文献を調べてみようと思います。 実際に使用する際は、とりあえずはあまりこだわらないことにします。 ありがとうございました。