2013-04-02 64 views
0

我是java和makefile的新手,我想了解一些有關makefile的介紹性信息。通常在網上找到的信息大多是示例和高級別的信息。以下是關於makefile的一些具體/天真的問題:關於java makefile的基礎知識

  1. 什麼類型的文件是生成文件的目標? .class和.java?

  2. 什麼是一個makefile做這些項目的文件?我在Eclipse中完成了項目,因此.class文件存儲在bin中,而.java文件存儲在scr中。 makefile在這些文件之間建立什麼樣的連接?

  3. 什麼是makefile的結果呢? makefile的目的是告訴編譯器如何創建一個可執行文件,因此結果是當前目錄中的一個新的可執行文件,是的?

  4. 我應該在哪裏放置生成文件?在bin文件夾中? scr文件夾?將所有蒼蠅混合在一個目錄下並放在那裏?

  5. 最後,我做了一個小的makefile爲我的項目應編制3班。它不工作,我不知道爲什麼:

生成文件:

JFLAGS = -g 
JC = javac 
.SUFFIXES: .java .class 
.java.class: 
    $(JC) $(JFLAGS) $*.java 

CLASSES = \ 
    DNA.java \ 
    C.java \ 
    fastmatch.java 

default: classes 

classes: $(CLASSES:.java=.class) 

clean: 
    $(RM) *.class 

難道我做錯了什麼?我只是把所有東西放在一個文件夾下,然後在命令行輸入「make」。我想我在這裏錯過了一些大圖片,所以如果有人能向我解釋他們,我會非常感激。由於

+1

大的情況是,在Java領域我們不使用'make'。試着搜索'ant'或'maven'或'gradle'或'sbt'。 –

回答

7

make不是構建Java正確的工具。您應該使用AntMaven或其他Java構建工具。這是可能獲得與make完成任務,但任何東西,但最瑣碎的Java程序,你將最終與刪除一切從頭開始,每次重新編譯生成文件。

在C和朋友的土地上發揮作用。在那裏,一個源文件依賴於它導入的所有頭文件,頭文件不依賴於任何文件(因爲它們沒有被編譯),所以你的依賴樹不會太深。在Java中,每個類都依賴於它導入的每個類,而這些類依賴於更多的類,所以通常情況下,如果不編譯項目中的其他每個類,就無法編譯單個類。你可能描述了你的makefile文件,但是在不到一秒的時間內完成Ant的工作將花費數小時的時間。

所有這一切說:

  1. 「目標」 是東西,makefile文件正在生成。如果你不寫一個編寫代碼的代碼,那麼.java文件是不是你已經發布,.class文件將在相同的位置最終成爲相應.java文件
  2. 的結果目標在Makefile
  3. makefile基本上可以做任何事情。 make本身就是一種相當強大的語言。這個 makefile文件的結果爲三編譯的Java類(可能更多,因爲javac可能會發現更多的類來編譯或您的某些類可能有內部類。同樣,這也就是爲什麼make是Java壞的工具)
  4. 一個makefile通常駐留在根項目目錄中。通常情況下,複雜的項目將有其他的子目錄的makefile文件
+0

所以我應該把makefile放在src和bin文件夾之外?我的老師特別想要一個Makefile(這意味着沒有Ant)。我的makefile會做這項工作嗎?而且,我應該使用哪個命令來運行它?謝謝! – turtlesoup

+0

@ user1926344你的導師真的希望你在Java中使用makefile嗎?我很擔心你得到的教學質量。 : - /除了使用makefile外,是否有任何規則?國際海事組織,這裏最好的makefile將是一個明確地編譯所有東西,而不嘗試使用花哨的制定規則。 –

+1

whops剛剛意識到他對java文件的說法,我們應該編寫一個腳本來編譯所有內容。所以我在所有的.java文件上都做了javac,這似乎很有用。感謝您爲我澄清概念! – turtlesoup

1

我很難記得我的化妝,但我認爲你需要:

%.class : %.java 
     $(JC) $(JFLAGS) $< 
+0

是:http://www.gnu.org/software/make/manual/html_node/Pattern-Rules.html#Pattern-Rules –