2017-04-26 10 views
0

をコンパイルするためには、私は私がそれを入力する必要がないように、スクリプトを作るために私のmac端子を使用したい私はCプログラムをコンパイルする場合、スクリプトは通常、Cコード

cc -o number_input number_input.c 

を入力しnumber_input.cと呼ばれます余分な単語。もともと私はプログラミングの1秒を節約するためにこれをしましたが、皮肉なことに、これを動作させるために2時間以上かけました。

a= echo "$1" | rev | cut -c3- | rev 
echo $a 
cc -o $a $1 
echo $1 

これは私の出力である:

number_input

clang: error: no input files number_input.c

私は名前が正しく入力されていますが、何らかの理由でccコマンドは$1の値を取っていないことを伝えることができますか?私は何とか$1が文字列などに直接変換されていないと確信していますが、わかりません。

+1

Makefileを使用する必要があります。 – piwi

+1

あなたはMakefileを使うことができました。また、CMakeやNinja、bfg9000、gyp、または... – You

+1

を使うこともできますが、コンパイルされるファイルは1つだけなので何もしません! –

答えて

5

あなたはaには何も割り当てていないので、あなたのエラーは、最初の行にある:あなたがさらに引用符が欠落しているので、

a=$(echo "$1" | rev | cut -c3- | rev) 

は、少なくとも、行儀のファイル名のために(問題を修正するだろうあなたのスクリプトの下に)。 aの後のスペースは、空の文字列を割り当てていることを意味し、、次に、パイプラインのコマンドを実行しています。代わりにちょうど${1%??}と最後の2つの文字を削除し、二回逆転のすべての努力に行くの

cc -o "${1%??}" "$1" 
1

これを行うための最も一般的なツールがmakeです。レシピは実行されたディレクトリのMakefileというファイルからレシピを読み取り、必要なタスクを実行します。プロジェクトのどの部分を再コンパイルする必要があるかを検出するには、ファイルのタイムスタンプを確認するだけで十分です。 Makefileでのインデントはタブではなくスペースを使用しなければならないこと

CC  := gcc 
CFLAGS := -Wall -O2 
LDFLAGS := -lm 

PROGS := number_input 

.PHONY: all clean 

all: $(PROGS) 

clean: 
    rm -f $(PROGS) 

$(PROGS): %: %.c 
    $(CC) $(CFLAGS) $^ $(LDFLAGS) -o [email protected] 

注:ここでは例のMakefileがあります。上記をコピーしてファイルに貼り付ける場合、インデントを修正するにはsed -e 's|^ *|\t|' -i Makefileを実行する必要があります。

コンパイラが使用した最初の3行の名前、コンパイラオプション、およびリンクオプション。特定のユースケースでは、-lmリンクオプションは必要ありません。あなたは遅かれ早かれ、<math.h>を使用したいので、それを含めたばかりです。そして、-lmリンクオプションを含める必要があります。

PROGSプログラム名は、複数指定することもできます。スペースで区切るだけです。

.PHONY:makeのターゲットにallcleanがその名前のファイルを生成しないことを示しています。

Makefileの最初のレシピとしてallレシピは、makeを実行したときのデフォルトのレシピです。これは、PROGSにリストされているすべてのプログラムをビルドする必要があることを示しています。

cleanレシピ(実行make clean)はすべての一時ファイルとコンパイル済みファイルをディレクトリから削除します。

最後のレシピはトリッキーなものです。 PROGSにリストされているすべてのファイルは、同じ名前のファイルと接尾辞が.cで作成されています。 $^は、ファイル名が.c、ファイル名が[email protected]であることを示します。

このMakefileが先生に電子メールを介しての練習を返すために使用された場合、私はまた、新しい.PHONYターゲット、tarball追加したい:number_input.cが後に変更されている場合makeは、number_inputをコンパイルします実行

CC  := gcc 
CFLAGS := -Wall -O2 
LDFLAGS := -lm 

PROGS := number_input 
TAR  := $(notdir $(CURDIR)).tar 

.PHONY: all clean tarball 

all: $(PROGS) 

clean: 
    rm -f $(PROGS) 

tarball: clean 
    rm -f ../$(TAR) 
    tar -cf ../$(TAR) $(notdir $(CURDIR))/ 

$(PROGS): %: %.c 
    $(CC) $(CFLAGS) $^ $(LDFLAGS) -o [email protected] 

は、最後にnumber_inputがコンパイルされた場合、またはnumber_inputがまだ存在しない場合

make TAR=myname-ex01.tar tarballを実行すると、現在のディレクトリからコンパイルされたファイルが削除され、親ディレクトリの現在のディレクトリ(およびサブディレクトリがある場合)のtarballがmyname-ex01.tarとして作成されます。 make tarballを実行すると、tarファイル名は現在のディレクトリの名前と同じになりますが、接尾辞は.tarです。

私はMakefileを書くことがなぜ有用であるかを見ることができたら幸いです。

関連する問題