2017-03-30 8 views
0

私の先生が説明Cで最善ではないので、私はmakefileの接続を理解するのに少し問題があります。私はすでにcomplex.c、complex.h、main.cのコードを追加しています。 makeコマンドを使ってコンパイルするのに問題があります。私は彼が手渡されたパワーポイントの例に従っていたので、それがなぜ複雑になるのか理解できません。Cメークファイルエラー:ldが返されました。終了

メイク

complex: main.o complex.o 
    gcc -o complex main.o complex.o 
main.o: main.c complex.h 
    gcc -c main.c -lm 
complex.o: complex.c complex.h 
    gcc -c complex.c -lm 
clean: 
    rm*.o complex 
    ls 

main.o

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

complex.o

complex.o: complex.h 
    gcc -c complex.c 

エラー

mason% make 
gcc -o complex main.o complex.o 
ld: fatal: file main.o: unknown file type 
ld: fatal: file processing errors. No output written to complex 
collect2: error: ld returned 1 exit status 
*** Error code 1 
make: Fatal error: Command failed for target `complex' 
+0

'gcc'が' main.o'をオブジェクトファイルとして認識しないことは非常に奇妙です。これをどのような環境(OS、&c)で実行していますか? – Dolda2000

+0

@ Dolda2000私はMACを使用しています – struggling

+0

あなたは毎回 'make clean'を実行する必要があります。 'main.o'が存在するように見えますが、システムが間違っているか、壊れている(または間違っています)。 –

答えて

2

main.ocomplex.oの中にMakefileの断片を入れたようです。これらは、ではなく、コンパイラによってで生成されます。

これらのファイルを削除し、再度makeを削除してください。

さらに、make cleanルールにはスペースがありません。

clean: 
    rm *.o complex 
    ls 

もう1つ。コンパイル行には-lmの必要はありません。

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

リンクフェーズでは、-lmを追加する必要があります。

complex: main.o complex.o 
    gcc -o complex main.o complex.o -lm 
+0

私は、main.oとcomplex.oを一緒にリンクすることに依存する最終実行可能ファイル "complex"を持っているとします。私の教授はまた、コンパイラが#includeを認識するように、makefileで-lmを使用しなければならないと言った。。 – struggling

+0

@struggling、実際に 'complex'をビルドするときにリンクフェーズで' -lm'を実行します。 – merlin2011

+0

私はすべてをやったが、なぜ同じエラーが出るのか分からない。 – struggling

0

"Makefile"はビルドの依存関係を定義し、制御します。

たとえば、バイナリオブジェクト/モジュールファイルを最初にビルドせずにメイン実行可能バイナリをビルドすることはできません。この場合、それらはmain.ocomplex.oです。

一般に、必要なオブジェクトファイルもルールを必要とします(いくつかのルールでは、ビルドに「ワイルドカード」を使用できます)。

これはすべて学術的です。彼らの言葉で誤りを犯し、それを反証しようとするのが最良です(これは基本的にmain.oが存在し、間違っていると言っています)。この場合、main.oが存在するという仮説は、makeコマンドを実行したときにコンパイルされなかったという事実によってサポートされています。

"ターゲット"を使用して "make"を呼び出すまで、もっと詳しく知るまでは。のような:make cleanmake complex。明快さをもたらすのに役立つかもしれません。

多くのメイクファイルは、ビルドをリセットするソートに「すべて」のターゲットを配置しています。それは、 "クリーン"と実行可能ファイルとライブラリのターゲットに依存します。 Like:

all: clean complex 

だから、あなたはきれいにしてビルドするようにします。

良いチュートリアルはこちらです。Mrbook Makefile Tutorial

関連する問題