簡體   English   中英

我嘗試編寫自己的 makefile 但它不起作用

[英]I try to write my own makefile but it doesn't work

#define the suffixes
.SUFFIXES: .java .class

#compile all java files to .class
.java.class:
        javac -g *.java

#CounterStatTester is a tester class for CounterStat
CounterStatTester.class: CounterStat.class

test: CounterStatTester.class CounterStat.class
        java CounterStatTester

當我嘗試“進行測試”時,shell 顯示“make: *** No rule to make target `test'。停止。” 但是我確實寫了“java CounterStatTester”,為什么還是找不到規則?

這里有很多風格不佳的例子。 我將嘗試按出現的順序列出所有問題,而不是僅僅回答問題。 如果你按照我的建議去做,你原來的問題肯定會消失。

如果您知道自己在做什么並且有充分的理由這樣做,並且已經學會了良好的風格,那么使用“糟糕的風格”是可以的。 在你的情況下,這些都不是。

  1. .SUFFIXES已過時,不應用於新代碼

  2. 同樣,像.java.class:這樣的“后綴規則”已經過時,不應使用。

  3. 無論如何,您的.java.class:規則應該采用一個.java文件並生成一個.class文件。 生成文件中的良好風格是每個規則配方​​一次生成一個目標,而不是多個目標。

所以,你應該有這樣的東西:

%.class: %.java Makefile
        javac -g $<
  1. CounterStatTester.class沒有理由應該“依賴”於CounterStat.class所以你不應該有那個規則。 在這種情況下,“依賴”意味着CounterStatTester.class的配方讀取CounterStat.class CounterStatTester.class確實依賴於CounterStatTester.java (以及不太明顯的 Makefile),我向您展示的規則已經捕獲了它。

  2. 正如我上面提到的,每個規則配方​​應該寫一個目標。 由於test不是一個文件,而是一個抽象的概念,所以它不能寫,因此它不應該有一個帶有recipe的規則。

編寫 makefile 的目的是,除非必要,否則您不必執行配方,從而節省時間。 在您的情況下, test根本不存在,因此將始終執行配方,這對於 makefile 毫無意義。

相反,您應該有一個名稱類似於CounterStat_tested的文件和如下規則:

CounterStat_tested: CounterStatTester.class CounterStat.class Makefile
        java CounterStatTester && touch $@
  1. 最后,makefile 的頂部應該有一個all目標:

     .PHONY: all all: CounterStatTester.class CounterStat.class CounterStat_tested

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM