2017-10-09 38 views
0

我想製作一個簡單的makefile。我有一個頭文件:「guiBuilder.h」。我有另一個文件將使用它:「client.c」。我使用的makefile文件是:製作一個makefile - 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

規則在make文件的格式爲:

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目標中的gcc命令)失敗。

目標program.o與目標program有同樣的問題。你不是正在建設program.o,你正在建設client.o。此目標需要更改爲

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

這是愉快地依賴於您的Client目標。

注意make規則的命令部分的縮進必須用選項卡完成。如果複製我的答案或任何其他答案或鏈接問題中的答案,請確保您的縮進是製表符,而不是空格。

更新

如果你有一個guiBuilder.c功能在guiBuilder.h原型你需要編譯guiBuilder.c並將其添加到鏈接階段(與test()是一個未定義的參考這個問題)。

您的guiBuilder.o規則看起來非常相似的規則client.o

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

然後你需要添加guiBuilder.oClient

Client: client.o guiBuilder.o 
    gcc client.o guiBuilder.o -o Client 

的依賴你可能已經注意到,你現在有創建.o文件的兩條規則與源和目標文件的名稱不同。 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,dependencyrecipe。通過以下方式

target: dependency 
     recipe 

當您運行make命令,它會搜索與名稱Makefilemakefile一個文件,並開始分析的目標和依賴,並執行該目標的配方。

在Makefile要創建最終的二進制名稱爲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