ルールの形式は次のとおりです。
target: dependency1 dependency2 etc
command to build target
target
あなたがを構築したいファイルの名前です。その行は
program: client.o
gcc client.o -o Client
program
というファイルを作成しようとしています。ただし、コマンドはprogram
というファイルを作成せず、Client
というファイルを作成します。これはあなたが思うかもしれない問題ではなく、Client
が最新であるかどうかにかかわらずルールが常に実行されることを意味します。ただし、ターゲットをビルドするファイルに変更する必要があります。最もにおけるところで
Client: client.o
gcc client.o -o Client
、* nixes、ファイル名は大文字と小文字を区別Client
とclient
あり、例えばLinux上の異なるファイルです。
このルールには、単一の依存関係があります。client.o
です。残念ながら、makeファイルにはclient.o
のビルド方法がわかりません。client.o
というターゲットはありません。
エラーの原因は、古いclient.o
が掛かっていて、その中にmain()
機能がないことが原因であると推測しています。このため、リンク(コマンドはprogram
ターゲットにありません)が失敗しています。
ターゲットprogram.o
は、ターゲットprogram
と同じ問題があります。あなたはprogram.o
を建てておらず、建物はclient.o
です。このターゲットは喜んであなたのClient
ターゲットの依存である
client.o: client.c $(HEADERS)
gcc -c client.c -o client.o
に変更する必要があります。
注make
ルールのコマンド部分のインデントはタブで行う必要があります。自分の答えやその他の回答、またはリンクされた質問の回答をコピーして貼り付ける場合は、インデントがスペースではなくタブであることを確認してください。
更新(test()
が未定義参照さの問題)
あなたがguiBuilder.c
をコンパイルおよびリンク・フェーズに追加する必要がありますguiBuilder.h
でプロトタイプを持っているguiBuilder.c
で機能を持っている場合。
あなたguiBuilder.o
ためのルールはclient.o
guiBuilder.o: guiBuilder.c $(HEADERS)
gcc -c guiBuilder.c -o guiBuilder.o
のルールと非常によく似ていますそして、あなたはあなたが今持っていることに気づいたかもしれませんClient
Client: client.o guiBuilder.o
gcc client.o guiBuilder.o -o Client
の依存関係としてguiBuilder.o
を追加する必要があります.o
ファイルを作成するための2つのルールは、ソースファイルとオブジェクトファイルの名前以外は同じです。受け入れられたthe question that you linkedの答えは、ルールを一度定義するだけで済むようにmakeファイルを変更する方法を示しています。
Makefileを使用しない場合は、ビルドしますか? – Steve
'program.o'のルールは' client.o'を生成します –
また、 'client.c'に" main "サブルーチンがありますか? makeを使わずに正常にビルドできますか? –