2016-01-28 3 views
1

Я создаю make-файл для компиляции всего кода и запуска приложения. Проект написан на JAVA. Это ошибка, которая бросить, когда вы выполняете макияж:Ошибка в make-файле

classes 
make: classes: Command not found 
make: *** [default] Error 127 

и это Makefile

JFLAGS = -g 
JC = javac 
JVM = java 

.SUFFIXES: 
    .java .class 

.java.class: 
    $(JC) $(JFLAGS) $*.java 

CLASSES := $(wildcard src/com/github/jotask/groupproject/*.java) 
CLASSES += $(wildcard src/com/github/jotask/groupproject/util/*.java) 
CLASSES += $(wildcard src/com/github/jotask/groupproject/model/*.java) 
CLASSES += $(wildcard src/com/github/jotask/groupproject/gui/*.java) 
CLASSES += $(wildcard src/com/github/jotask/groupproject/connection/*.java) 
CLASSES += $(wildcard src/com/github/jotask/groupproject/connection/dao/*.java) 

MAIN=Application 

default: 
    classes 

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

run: $(MAIN).class 
    $(JVM) $(MAIN) 

clean: 
    $(RM) *.class 

Любая идея, почему эта ошибка бросить?

ответ

2

Проблема здесь.

default: 
    classes 

Это говорит о том, что цель default имеет рецепт с помощью одной команды в нем. Эта команда classes. Поэтому, когда make пытается создать цель default, он пытается запустить команду classes, и вы получите эту ошибку.

Вы имели в виду default: classes, чтобы иметь classes быть обязательным условием цели default.

Это означает, что вам не нужна цель default и вы можете просто избавиться от нее.

Цель по умолчанию в файле makefile - это первая найденная явная цель.

Аналогично

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

неправильно и должно быть classes: $(CLASSES:.java=.class) при условии, вы имели в виду make classes строить .class файлы и

.SUFFIXES: 
    .java .class 

неверен таким же образом, и хочет быть .SUFFIXES: .java .class.

Тогда вы, вероятно, также захотите добавить другие классы в список обязательных условий: run, чтобы они (если бы они) были построены, если необходимо.

Так что вы, вероятно, хотите что-то подобное сказать.

JFLAGS = -g 
JC = javac 
JVM = java 

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

SRCS := $(wildcard src/com/github/jotask/groupproject/*.java) 
SRCS += $(wildcard src/com/github/jotask/groupproject/util/*.java) 
SRCS += $(wildcard src/com/github/jotask/groupproject/model/*.java) 
SRCS += $(wildcard src/com/github/jotask/groupproject/gui/*.java) 
SRCS += $(wildcard src/com/github/jotask/groupproject/connection/*.java) 
SRCS += $(wildcard src/com/github/jotask/groupproject/connection/dao/*.java) 

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

MAIN=Application 

.PHONY: run 
run: $(CLASSES) 
    $(JVM) $(MAIN) 

.PHONY: clean 
clean: 
    $(RM) $(CLASSES) 

.PHONY: classes 
classes: $(CLASSES) 

Какого

  • использует более современные Pattern Rules (вместо старых Suffix Rules)
  • имен вашего переменный немного более четко
  • отмечает Phony Targets правильно
  • падает ненужную default цели
  • и делает run новый по умолчанию (и он автоматически создает все классы).
+0

Спасибо за ответы. Это потому, что я слежу за старыми учебниками, которые, как я думаю. Это первый раз, когда я делаю make-файл. Теперь я получаю следующую ошибку: http://pastebin.com/HeX7AgHC. Я думаю, что они не могут найти этот класс, и я смотрел внутри этого пакета (папки), и есть ли этот файл –

+0

. Как выглядит ваш make-файл на данный момент, потому что это явно не тот, который я написал (не совсем) ,Вы добавили новые строки после '.PHONY:'? Нужно ли составлять эти классы в определенном порядке? Вам нужно указать «-classpath», чтобы найти классы? –

+0

Это файл makefile http://pastebin.com/Ndsm2x4H. Я ничего не добавил. Я не думаю, что им нужен определенный порядок (и я не знаю, правда ли это). Может быть, проблема в том, что я использую внешние библиотеки? Библиотеки находятся в папке lib на том же уровне, что и папка src, это вопрос? –