makefileでの-Iフラグと-Lフラグの使用法は何ですか?
3 に答える
これらは通常、リンカーコマンドラインの一部であり、ターゲットアクションで直接提供されるか、より一般的には、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...
ディレクティブはそれらのシンボルを参照するオブジェクトの後に続くことになっています。リンクが間違った順序で行われると、一部の最適化(-Wl,--as-needed
最も明白です)は失敗します。
makefileを実際に作成するには、プロジェクトのツールチェーンのすべてのコンポーネントのコマンドラインについても十分に理解している必要があります。のようなオプションは、make自体では理解されません-I
。-L
むしろ、makeは、前提条件ファイルをターゲットファイルに変換するツールを実行するコマンドラインを作成しようとしています。
多くの場合、これはCまたはC ++のソースファイルがオブジェクトファイルにコンパイルされ、最終的にリンクされて実行可能ファイルを取得します。
その場合は、コンパイラのマニュアル、特にコンパイラが理解できるコマンドラインオプションに関連するビットを参照する必要があります。
一般的な言葉で言えば、これらの特定のオプションは、コンパイラーとリンカーの間でかなり標準的です。-I
コンパイラーが#include
行で指定されたファイル-L
を検索する場所のリストにディレクトリーを追加し、リンカーが-l
オプションで指定されたライブラリーを検索する場所のリストにディレクトリーを追加します。
肝心なのは、makefileの「言語」は、makefile自体の構文、作成することが知られているシェル(通常、/bin/sh
または同様のもの)、一般的なシェルコマンド(、、、など) rm
、およびコンパイラとリンカに固有のコマンド(たとえば、シェルプロンプトで入力すると、gccが1つの開始点として理解するオプションのほぼ完全な(そして非常に長い)リストが表示されます)。cp
install
gcc -v --help
注意すべきことの1つは、これらがコンパイラ/リンカに渡されるオプションであるということです。したがって、コンパイラのマニュアルページ/ドキュメントを見て、それらの役割を知る必要があります。