2017-10-09 9 views
0

私は単純なメイクファイルを作ろうとしています。私は1つのヘッダファイル "guiBuilder.h"を持っています。私はそれを使用する別のファイルがあります: "client.c"。私が使っているメイクファイルは次のとおりです。メークファイルを作る - C

HEADERS = guiBuilder.h 

default: program 

program.o: client.c $(HEADERS) 
    gcc -c client.c -o client.o 

program: client.o 
    gcc client.o -o Client 

私はここで、このためのコードが見つかりました:

How do I make a simple makefile for gcc on Linux?

私はそれを実行したときに、私は今、このエラーが出る:

(.text+0x20): undefined reference to `main' collect2: error: ld returned 1 exit status Makefile:9: recipe for target 'program' failed make: *** [program] Error 1

+0

Makefileを使用しない場合は、ビルドしますか? – Steve

+4

'program.o'のルールは' client.o'を生成します –

+1

また、 'client.c'に" main "サブルーチンがありますか? makeを使わずに正常にビルドできますか? –

答えて

4

ルールの形式は次のとおりです。

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、ファイル名は大文字と小文字を区別Clientclientあり、例えば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ファイルを変更する方法を示しています。

+0

これで、私はclient.c :(。text + 0x2d):makefileを実行すると 'test 'への参照が未定義になります。私はclient.cにguiBuilder.hを含めました。 –

+0

@ChristopherLittlewood 'test'はどこに宣言されていますか? – JeremyP

+0

はい。テストはguiBuilder.cで宣言され、guiBuilder.hで参照されています –

0

私は提案しますあなたはGNU Make manualを読んで、makeコマンドとmakefileがどのように機能するかを理解することができます。

あなたの質問に答えるために、Makefileは基本的なものがtarget,dependencyおよびrecipeであるいくつかのもので構成されています。あなたがmakeコマンドを実行すると、次のよう

target: dependency 
     recipe 

では、それは名前Makefilemakefileを持つファイルを検索し、それがターゲットと依存関係の解析を開始し、その目標のためのレシピを実行します。ので、あなたのメイクファイルは、以下のようなものに行く必要がありますが、名前programで、最終的なバイナリを作成したいが、あなたはprogram.cを持っていないあなたのmakefileで

:メイクファイルで

HEADERS = guiBuilder.h 

all: program 

client.o: client.c $(HEADERS) 
      gcc -c client.c 

program: client.o 
     gcc client.o -o program 
+2

なぜルール?それらの順序は、最初のルールが自動的に* default *ルールであることを除いて、まったく重要ではありません。 –

+0

ルールをシリアル順に編集しました。 – Gaurav

関連する問題