Makefileでの-Iおよび-Lフラグの使用法は何ですか?
これらは通常、リンカコマンドラインの一部であり、ターゲットアクションで直接提供されるか、リンクコマンドを形成するために展開されるmake
変数に割り当てられます。その場合:
-L
は、ライブラリを含むディレクトリへのパスです。ライブラリの検索パス。
-l
は、リンクするライブラリの名前です。
たとえば、追加するライブラリ~/libs/libabc.a
にリンクする場合:
-L$(HOME)/libs -labc
リンクのデフォルトの暗黙のルールを利用するには、次のようにこれらのフラグを変数LDFLAGS
に追加します
LDFLAGS+=-L$(HOME)/libs -labc
LDFLAGS
とLIBS
を分けるのは良い習慣です。例えば
# LDFLAGS contains flags passed to the compiler for use during linking
LDFLAGS = -Wl,--hash-style=both
# LIBS contains libraries to link with
LIBS = -L$(HOME)/libs -labc
program: a.o b.o c.o
$(CC) $(LDFLAGS) $^ $(LIBS) -o $@
# or if you really want to call ld directly,
# $(LD) $(LDFLAGS:-Wl,%=%) $^ $(LIBS) -o $@
他の方法で機能する場合でも、-l...
ディレクティブは、これらのシンボルを参照するオブジェクトafterに移動することになっています。リンクが間違った順序で行われると、一部の最適化(-Wl,--as-needed
が最も明らか)は失敗します。
メイクファイルを本当に理解するには、プロジェクトのツールチェーンのすべてのコンポーネントのコマンドラインを十分に理解する必要があります。 -I
や-L
などのオプションは、make自体では理解されません。むしろ、makeは、前提条件ファイルをターゲットファイルに変換するツールを実行するコマンドラインを作成しようとしています。
多くの場合、これはCまたはC++ソースファイルがオブジェクトファイルにコンパイルされ、最終的にリンクされて実行可能ファイルを取得します。
その場合、コンパイラのマニュアル、特に理解できるコマンドラインオプションに関連するビットを参照する必要があります。
一般的な用語で述べたすべてのことは、これらの特定のオプションはコンパイラとリンカの間でかなり標準的なものです。 -I
は、#include
行で指定されたファイルのコンパイラが検索した場所のリストにディレクトリを追加し、-L
は、リンカーが検索した場所のリストにディレクトリを追加します-l
オプションで指定されたライブラリ。
一番下の行は、メイクファイルの「言語」はメイクファイル自体の構文、作成することが知られているシェル(通常は/bin/sh
または同様のもの)、一般的なシェルコマンド(rm
、cp
、install
など)、およびコンパイラとリンカに固有のコマンド(たとえば、シェルプロンプトでgcc -v --help
と入力すると、ほぼ完全な(非常に長い)gccが1つの出発点として理解しているオプションのリスト)。
注意すべきことの1つは、これらがコンパイラ/リンカーに渡されるオプションであることです。そのため、コンパイラのマニュアルページ/ドキュメントを参照して、その役割を確認する必要があります。