8



私は「LearnCtheHardWay」を通じてCプログラミングを学んでいます。私は現在(かなり長い間)演習2に取り組んでいます。これは、http://c.learncodethehardway.org/book/ex2.htmlにあります。

追加のクレジットセクションには、「make」コマンドだけを使用して.cファイル(ex1.c)をコンパイルできるように、Makefileを編集するように求めるチャレンジがあります。これは挑戦が正確に言うことです:

コマンドmakeだけでex1をビルドするall:ex1ターゲットを作成します。

ここと他の多くの場所を見て、これは私が正しいと思うコードです:

CFLAGS="-Wall" -g

all: ex1
    CFLAGS="-Wall" -g

clean:
    rm -f ex1

ただし、これを実行しようとすると、コンパイルされたファイルが取得され、エラーが発生し続けます。

cc "-Wall" -g    ex1.c   -o ex1
CFLAGS="-Wall" -g
/bin/sh: 1: -g: not found
make: *** [all] Error 127

ここで何が起きてるの?エラーメッセージの背後にある理由は何ですか?どうすればこれを修正できますか?

みんなありがとう。

4

3 に答える 3

10
  • がmakefileの最初のターゲットである場合all(Makefile全体を表示していないため、ここでは大げさな推測をしています)、コマンドから明示的なターゲットを渡さない場合、makeはそれをビルドする最初のターゲットとして選択します。行(つまり、単なるmake

  • ex1はの前提条件であるためall、最初にビルドするため、次の行が表示されます。

    cc "-Wall" -g    ex1.c   -o ex1
    
  • ビルド後ex1、makeはすべてのレシピの実行を試み、次のコマンドを実行します。

    CFLAGS="-Wall" -g
    
  • それ-g自体はシェルで実行できる有効なコマンドまたはアプリケーションではないため、次のエラーが発生します。

    /bin/sh: 1: -g: not found
    

解決:

  • makefileの最初ですでに定義CFLAGSしているので、レシピでもう一度定義する必要はありません。変数をオーバーライドしたい場合でもCFLAGS、レシピの一部として直接使用しないでください。

  • まだ定義allしていない場合は、ターゲットcleanとして定義します。PHONYターゲットallとは、レシピの実行後に名前が付けられたファイルcleanを作成しないため、これらのターゲットをとして分類することをお勧めします。allcleanPHONY

  • 二重引用符は必要ありません-Wall

次のMakefileには、これらすべての修正が含まれています。

CFLAGS = -Wall -g

all: ex1

clean:
    rm -f ex1

.PHONY: all clean
于 2013-03-24T20:35:15.137 に答える
4
CFLAGS = -Wall -g

all: ex1

clean:
    rm -f ex1

makeには、.cファイルを実行可能ファイルにコンパイルするためのデフォルトのルールが組み込まれているため、必要なのはこれだけです。

あなたの間違いは、コマンドとして変数の割り当てを使用することです。の部分

 CFLAGS="-Wall" -g

-gワンショット変数割り当てを使用してコマンドを実行しようとしますCFLAGS="-Wall"

于 2013-03-24T20:35:07.137 に答える
0

これがソースコードの最初のコンパイルであるか再コンパイルであるかに関係なく、ex1入力するだけでビルドできるように、1つの調整を提案したいと思います。make

ソース: ex1.c

Makefile:

CFLAGS=-Wall -g

all : clean ex1

clean:
    rm -rf ex1 ex1.dSYM

.PHONY: all clean

の最初の前提条件としてPhonyTargetを追加することにより、cleanPhony Targetは、前提条件を使用して暗黙のコマンドを実行する前にコマンドを実行します。allrm -rf ex1 ex1.dSYMccex1

また、Mac OS-Xでは、のコマンドを実行する.PHONY all cleanためにを使用する必要はありませんが、後でコードを読む人がすべてとクリーンが実際のターゲットファイルではないことを認識できるように設定することをお勧めします。makeMakefile

ああ、そしてZed A. Shawに、Learn theHardWayを彼のサイトLearnCtheHardWayで無料で読ませてくれたことに感謝します

于 2015-07-22T05:10:06.253 に答える