2017-03-13 6 views
0

私はMakefileを作成しました。今、私はこれらのエラーを取得:Makefileエラーを修正するには?

  • 打ち鳴らす:警告:brians_brain.o: 'リンカ' は、入力未使用
  • 打ち鳴らす:警告:cell.o: 'リンカ' は、入力未使用
  • 打ち鳴らす警告:cell_grid.o:アーキテクチャx86_64のための 'リンカー' 入力未使​​用
  • 未定義シンボル: "_List_Delete" から参照:brians_brain_cellで _main ular_automata.oから参照 "_List_Read":brians_brain_cellular_automata.o LDにおける _main:シンボル(S)アーキテクチャx86_64の 打ち鳴らすが見つかりません:エラー:リンカーコマンドが終了コード1(呼び出しを参照する-v使用) で失敗しました作る:*** [brians_brain_cellular_automata]エラー1

ここではMakefileのです:

brians_brain_cellular_automata: brians_brain_cellular_automata.o brians_brain.o cell.o cell_grid.o 
    gcc -Wall brians_brain_cellular_automata.o brians_brain.o cell.o cell_grid.o 

brians_brain_cellular_automata.o: brians_brain_cellular_automata.c brians_brain.o cell.o cell_grid.o 
    gcc -Wall -c brians_brain_cellular_automata.c brians_brain.o cell.o cell_grid.o 

brians_brain.o: brians_brain.c cell_grid.o cell.o list.o 
    gcc -Wall -c brians_brain.c cell_grid.o cell.o list.o 

cell_grid.o: cell_grid.c cell.o 
    gcc -Wall -c cell_grid.c cell.o 

cell.o: cell.c 
    gcc -Wall -c cell.c 

list.o: list.c cell.o 
    gcc -Wall -c list.c cell.o 

タブが適切に使用されていると仮定します。

今日、このMakefileが最も混乱しています。私は依存関係の1つにいくつかのコードを入力していました。私はそれらの変更を元に戻しましたが、私はまだこれらのエラーを取得します。私は間違って何をしていますか?

+0

本当にこれが本当に有効だったのですか? '-c'はコンパイルを行いますがリンクはしません。 '.o'ファイルがリンクに使われ、' -c'コマンドラインに渡されるべきではないので、ほとんどのルールは意味をなさないでしょう。 – kaylum

+0

@kaylum私はあなたが何を意味するかを見ます。この場合、すべてのオブジェクトファイルを作成し、それらを適切にリンクする最良の方法は何ですか? – darylnak

答えて

2

オブジェクトファイルをコンパイルするときは、ソースファイルを渡すだけで、他のオブジェクトファイルは渡す必要がありません。オブジェクトファイルは、実行可能ファイルでリンクするときに使用されます。それが警告の原因です。

エラーに関しては、実行可能ファイルをリンクするときにlist.oを含めることも、依存関係としてリストされないこともありません。したがって、そのファイル内の関数の「未定義参照」エラーが発生しています。

だからあなたのメイクファイルは次のようになります。

brians_brain_cellular_automata: brians_brain_cellular_automata.o brians_brain.o cell.o cell_grid.o list.o 
    gcc -Wall brians_brain_cellular_automata.o brians_brain.o cell.o cell_grid.o list.o 

%.o: %.c 
    gcc -Wall -c $< 

:各オブジェクトファイルが同じように構築されている

brians_brain_cellular_automata: brians_brain_cellular_automata.o brians_brain.o cell.o cell_grid.o list.o 
    gcc -Wall brians_brain_cellular_automata.o brians_brain.o cell.o cell_grid.o list.o 

brians_brain_cellular_automata.o: brians_brain_cellular_automata.c 
    gcc -Wall -c brians_brain_cellular_automata.c 

brians_brain.o: brians_brain.c 
    gcc -Wall -c brians_brain.c 

cell_grid.o: cell_grid.c 
    gcc -Wall -c cell_grid.c 

cell.o: cell.c 
    gcc -Wall -c cell.c 

list.o: list.c 
    gcc -Wall -c list.c 

ので、あなたが実際にオブジェクトファイルをコンパイルするためにワイルドカードを使用してルールを定義することができますこのルールでは、brians_brain_cellular_automataターゲットで参照されている各オブジェクトファイルがこのルールで構築されます。

+0

あなたは最高です。以前私を混乱させたのは、すべてが適切につながっていることを確認することでしたたとえば、一部のソースファイルは他のソースファイルに依存します。 – darylnak

+0

Makeは、 'cell.o'が' cell.c'から作成されたことを再度伝える必要なしに推論するのに十分な知識があることに注意してください。また、 '.c'ファイルを対応する' .o'ファイルにコンパイルする組み込みルールもあります。マクロを正しく設定するだけでコンパイルルールを適切に設定する必要があります。コンパイルコマンドラインを変更する方がずっと簡単です。最初の段落に似た何かが必​​要です。残りはありません。 –

関連する問題