2010-10-26 48 views
4

嘿所以我是一個新來的C,但一箇中等水平的程序員。我正在尋找文件,並有問題確切地說明它們是什麼,以及如何使用它們。因此,例如,目前我正在編譯每個我的檔案在我的項目分別通過鍵入:簡單的文件問題(C)

gcc -o newoutfilename1.out oldcfilename1.c 
gcc -o newoutfilename2.out oldcfilename2.c 

現在,如果我只是想運行一個make文件編譯他們的一次。我不想在最後看到它們全部放入一個文件中,看看它們沒有鏈接。也走得更遠。 makefile可以用於測試嗎?像後,我編譯爲newoutfilename1.out我想運行:

./newoutfilename1.out arg1 arg2 arg3 > intothisfile.data 

一般讓我的生活更輕鬆,同時編碼,如果代碼編譯,並提出了正確的數據測試。

+0

我想你彪:* GCC -o newoutfilename1 oldcfilename1.c *和* GCC -o newoutfilename2 oldcfilename2.c * – karlphillip 2010-10-26 00:55:34

+0

至於我自己的經驗,我可以命名OUTFILE什麼我請求。我錯了嗎?或者,也許你說,因爲他們是獨立的那裏沒有目標文件,那麼是的,你是對的。我會編輯。 – 2010-10-26 00:57:22

+0

是的,它是任何東西,對大多數連接器無關緊要。但是如果你指定一個帶有未知後綴的源文件,編譯器可能會生氣。 – Marm0t 2010-10-26 01:20:58

回答

3

在Interwebs上有幾個GNU Make教程。谷歌出現了一些點擊。您可以從this one開始。

+0

我想我的問題更具有以下重要性:您最終能否將所有文件都編譯爲一個文件?你可以在make文件中執行out文件嗎? – 2010-10-26 01:02:11

+1

是的,你可以將編譯後的對象鏈接到一個可執行文件中(使用ln或編譯器 - 通常你的編譯器使用ln-鏈接器) - 請參閱Angel的文章。如果文件中沒有定義'main',則不能執行out文件。爲了測試你必須將所有東西編譯成一個可執行文件,然後測試它(這就是爲什麼人們在惡性編輯,製作,運行和調試周期中生氣) – Marm0t 2010-10-26 01:19:23

+0

@ Marm0t希望我能接受你的評論作爲答案,但接受你的答案評論是必須做的。 – 2010-10-26 01:26:20

3

那麼,

鏈接你給的,凱琳,你是否在意讀它?

老實說,如果我沒有寫幾百個文件在我的生活中,我不會理解你鏈接的這個帖子中的一個單詞。

makefile是一種特殊的腳本。

每一行看起來是這樣的:

target: depends-on.c and.h and-even-another.h 
    command -o target depends-on.c 

第一行是所有文件,第二行是之前創建該文件的命令「:」

所以是一個文件。如果target比'depends-on.c'或'and.h'或'and-even-another.h'早,那麼第二行中的命令會被執行(假設它會創建/重新生成/輸出文件'target '),通常這些文件被稱爲target.o,如果從源文件編譯。

換句話說:一行描述輸出是什麼,在冒號後輸出依賴的文件,第二行是創建輸出的命令。

':'左邊的東西被稱爲'目標'。

目標可以依賴於其他目標。

您可以使用通配符。

*.o: *.c 
    cc -o "something you have to look up, dont now it from my mind ;D" 

program: *.o 
    ln *.o my.lib another.lib 

以上只編譯那些比對應的* .o文件更新的* .c文件,然後鏈接所有的*的.o連同兩個命名庫文件。

如果你在linux/unix機器上試試「man make」。否則谷歌; d

安傑洛

+0

不錯的教程!幾乎所有我發現的東西都不能被noob讀取,就像鏈接的那樣。你很體面。 – 2010-10-26 01:47:15

+0

呃,實際上,是的,在推薦它之前,我已經簡要地閱讀了這篇教程......我認爲它總結了我多年來實際發現的有用的Makefile結構。我會承認它的寫法有點學術風格,但我希望SO的大多數讀者能夠習慣CS文本中的那些... :-) – 2010-10-26 04:09:51