2017-06-18 7 views
0

私は現在、makefileを使ってCコードでプログラムをコンパイルしようとしていますが、プログラムはVisual Studioのウィンドウでうまくコピーします。私はクラス環境で動作させるつもりです使用KNOPPIX)acプログラムのmakefile(knoppix上)

私はガイドを使用してメイクファイルを作成し、これが出力されます:

[email protected]:~/Desktop/projfinal$ make 
gcc -c main.c 
make: Warning: File `q1.c' has modification time 8.2e+03 s in the future 
gcc -c q1.c 
gcc -c q2.c 
gcc -c q3.c 
gcc -c q4.c 
gcc -c q5.c 
gcc -c q6.c 
gcc -c q7.c 
gcc -o main.o q1.o q2.o q3.o q4.o q5.o q6.o q7.o 
/usr/lib/gcc/i486-linux-gnu/4.7/../../../i386-linux-gnu/crt1.o: In function `_start': 
(.text+0x18): undefined reference to `main' 
collect2: error: ld returned 1 exit status 
make: *** [runProject] Error 1 

私はコンパイルするためのmakefileにメインを含むファイルを追加しましたが、ここに私のメイクファイルは次のとおりです。

runProject: main.o q1.o q2.o q3.o q4.o q5.o q6.o q7.o 
    gcc -o main.o q1.o q2.o q3.o q4.o q5.o q6.o q7.o 

main.o: main.c projectHeader.h 
    gcc -c main.c 

q1.o: q1.c projectHeader.h 
    gcc -c q1.c 

q2.o: q2.c projectHeader.h 
    gcc -c q2.c 

q3.o: q3.c projectHeader.h 
    gcc -c q3.c 

q4.o: q4.c projectHeader.h 
    gcc -c q4.c 

q5.o: q5.c projectHeader.h 
    gcc -c q5.c 

q6.o: q6.c projectHeader.h 
    gcc -c q6.c 

q7.o: q7.c projectHeader.h 
    gcc -c q7.c 

clean: 
    rm runProject main.o q1.o q2.o q3.o q4.o q5.o q6.o q7.o 

どのような援助や洞察力をいただければ幸いです:)

+0

なぜあなたは、標準の決まり文句のように多くをオーバーライドしていますか? –

+0

もし私があなたをよく理解しているのであれば、メイクファイルに不必要な構文をたくさん書くのですか?それは私が今それをやる方法を学んだだけで、私はインターネットからそれをやったので、それを行う良い方法は何でしょうか? – BaywolfX

+0

makeは既に.oファイルをビルドする方法を知っています。ヘッダー要件を指定するだけです。 'q1.o:projectHeader.h'など –

答えて

0

をすぐに質問に答えるために、このルールは、単に間違っている:

runProject: main.o q1.o q2.o q3.o q4.o q5.o q6.o q7.o 
    gcc -o main.o q1.o q2.o q3.o q4.o q5.o q6.o q7.o 

のgccへ-oオプションは、出力ファイルを設定し、その代わりにmain.oとリンクここでは、他のすべてのオブジェクトファイルからmain.oと呼ばれる実行可能ファイルをリンクしようとしています。他のオブジェクトファイルにはmain()が含まれていません。これはあなたが得るリンカエラーを説明しています。クイックフィックスは、次のようになります。

runProject: main.o q1.o q2.o q3.o q4.o q5.o q6.o q7.o 
    gcc -o runProject main.o q1.o q2.o q3.o q4.o q5.o q6.o q7.o 

これはrunProjectと呼ばれる実行可能ファイルを作成します。


さらに改善が必要です。メイクルールのターゲットは、通常、そのルールによって作成されたファイルである必要があります。ルール内では、自動変数を使用できます。ターゲットの場合は[email protected]、最初のレスポンスの場合は$<または$^です。すべての前提条件(出力を作成するために必要な、コロンの後のファイル)。

GNU makeはパターンマッチングのためのワイルドカードとして%を使用するパターンルールもサポートしているので、同じルールを何度も何度も繰り返し書く必要はありません。

最後に、作成されたファイルの名前ではないターゲットは、.PHONYと宣言する必要があります。詳細はGNU make manualをご覧ください。

は、Makefileを推奨:

all: runProject 

runProject: main.o q1.o q2.o q3.o q4.o q5.o q6.o q7.o 
    gcc [email protected] $^ 

%.o: %.c projectHeader.h 
    gcc -c [email protected] $< 

clean: 
    rm -f runProject main.o q1.o q2.o q3.o q4.o q5.o q6.o q7.o 

.PHONY: all clean 
+0

ありがとう、私はこのメイクファイルを完全に理解していませんが、時間がかかり、さらにマニュアルを閲覧しています。私は質問のおかげで面白いことを学びました。私は自分のプロフェッサーに尋ねました。彼女はこれまでに教えてきた方法(不要な構文とすべて:|)で、主に高く評価されています。次回のために学ぶことを忘れないでください^^ – BaywolfX

関連する問題