11

割り当て用の C コードをコンパイルしていて、「make codeFile」を実行しました。ここで、「codeFile」は C プログラムの名前でした。メイクファイルはありませんでしたが、実行可能ファイルが作成され、実行されて動作しました。正しく。

なぜこれが機能したのか誰か知っていますか?makefile がなくても make が何かをコンパイルするのはなぜですか? 私が見つけた唯一の参照はこれでした: http://daly.axiom-developer.org/TimothyDaly_files/class5/node5.html

4

3 に答える 3

12

Make には、暗黙のルールを持つ内部データベースがあります。を使用make -pしてそれらを一覧表示できます。またmake -d、どのルールが適用されているかがわかるので、この場合に使用されている暗黙のルールを発見するのに役立ちます。

于 2013-04-01T14:27:23.037 に答える
10

Make には、事前に定義された暗黙のルールがいくつかあります。特に、あなたの場合、ターゲットに対して何をすべきかを決定しようとするときに、そのような2つのルールを使用しますcodeFile:

%: %.o    # Link object file
    $(CC) $(LDFLAGS) n.o $(LOADLIBES) $(LDLIBS)

%.o: %.c  # Compile C source code
    $(CC) $(CPPFLAGS) $(CFLAGS) -c
于 2013-04-01T14:26:40.337 に答える
6

makefile なしで make コマンドを使用しますか?

makeには、オーバーライドしない限りデフォルトとして機能する暗黙のルールがあります。

メイクのマニュアルページによると:

make -p -f/dev/null

実際にファイルを再作成しようとせずに、すべての暗黙のルール (および関連する環境変数) を一覧表示します。

使用法を示すためにmake、Cygwin で実行したところ、exeファイルが作成されました。.cmake に渡される名前に注意してください。

$ ls
hello.c
$ make hello
cc     hello.c   -o hello
$ ls
hello.c  hello.exe

これを Ubuntu Linux でも実行したところ、結果は上記とほぼ同じでしたが、.exe拡張機能は存在せず、代わりにプレーンなhello実行可能ファイルがありました。

$ ls
hello.c  hello

段階的な導出

make Implicit ルールの関連部分は次のとおりだと思います。

CC = cc

ccにエイリアスされていますCC

LINK.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)

LINKフラグが空になり、TARGET_ARCH変数も空になるフォーマットが作成されます (ユーザーがさまざまなターゲットアーキテクチャの値を設定できるようにするため)。次に、次のようになります。

%: %.c
#  recipe to execute (built-in):
        $(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@

^変数は前提条件ですhello.c。他の変数は空です。これらの後に、-oフラグとターゲット名が続きます。空の変数は、コマンド make run の余分なスペースを説明しています。

cc     hello.c   -o hello

そして、%: %.cmake に指定されたターゲットと、末尾が.c.

于 2015-06-01T19:23:28.867 に答える