規則在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,文件名是區分大小寫的Client
和client
是在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.o
爲Client
Client: client.o guiBuilder.o
gcc client.o guiBuilder.o -o Client
的依賴你可能已經注意到,你現在有創建.o
文件的兩條規則與源和目標文件的名稱不同。 the question that you linked的接受答案顯示瞭如何修改make文件,因此您只需要定義規則一次。
如果您不使用Makefile,它會生成嗎? – Steve
'program.o'的規則產生'client.o' –
另外,client.c中有一個「main」子例程嗎?你可以成功構建而不使用make,如果是這樣,怎麼做? –