web-dev-qa-db-ja.com

makefileの-Iと-Lの違いは何ですか?

Makefileでの-Iおよび-Lフラグの使用法は何ですか?

53
MainID

これらは通常、リンカコマンドラインの一部であり、ターゲットアクションで直接提供されるか、リンクコマンドを形成するために展開されるmake変数に割り当てられます。その場合:

-Lは、ライブラリを含むディレクトリへのパスです。ライブラリの検索パス。

-lは、リンクするライブラリの名前です。

たとえば、追加するライブラリ~/libs/libabc.aにリンクする場合:

-L$(HOME)/libs -labc

リンクのデフォルトの暗黙のルールを利用するには、次のようにこれらのフラグを変数LDFLAGSに追加します

LDFLAGS+=-L$(HOME)/libs -labc

LDFLAGSLIBSを分けるのは良い習慣です。例えば

# 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が最も明らか)は失敗します。

91
Nathan Fellman

メイクファイルを本当に理解するには、プロジェクトのツールチェーンのすべてのコンポーネントのコマンドラインを十分に理解する必要があります。 -I-Lなどのオプションは、make自体では理解されません。むしろ、makeは、前提条件ファイルをターゲットファイルに変換するツールを実行するコマンドラインを作成しようとしています。

多くの場合、これはCまたはC++ソースファイルがオブジェクトファイルにコンパイルされ、最終的にリンクされて実行可能ファイルを取得します。

その場合、コンパイラのマニュアル、特に理解できるコマンドラインオプションに関連するビットを参照する必要があります。

一般的な用語で述べたすべてのことは、これらの特定のオプションはコンパイラとリンカの間でかなり標準的なものです。 -Iは、#include行で指定されたファイルのコンパイラが検索した場所のリストにディレクトリを追加し、-Lは、リンカーが検索した場所のリストにディレクトリを追加します-lオプションで指定されたライブラリ。

一番下の行は、メイクファイルの「言語」はメイクファイル自体の構文、作成することが知られているシェル(通常は/bin/shまたは同様のもの)、一般的なシェルコマンド(rmcpinstallなど)、およびコンパイラとリンカに固有のコマンド(たとえば、シェルプロンプトでgcc -v --helpと入力すると、ほぼ完全な(非常に長い)gccが1つの出発点として理解しているオプションのリスト)。

26
RBerteig

注意すべきことの1つは、これらがコンパイラ/リンカーに渡されるオプションであることです。そのため、コンパイラのマニュアルページ/ドキュメントを参照して、その役割を確認する必要があります。

2
sateesh