2015-07-22 4 views
-1

Я столкнулся с очень странной проблемой makefile, вот он: Система: Linux CentOS 6 В начале имя файла makefile является «makefile», его выборкой содержание:Очень странная проблема makefile, нет такого файла или каталога

OPTFLAGS = -Wall -g -O 
CXX = g++ 
INC = -I/usr/local/include -I/usr/include 
LIBS = -L/usr/local/lib -L/usr/lib64  
CXXFLAGS = $(OPTFLAGS) $(INC) 

SOURCES = file1.cpp file2.cpp file3.cpp 
OBJECTS = $(SOURCES:.cpp=.o) 

EXECUTABLE = mybin 

$(EXECUTABLE): $(OBJECTS) 
    $(CXX) $(CXXFLAGS) $(INC) $(LIBS) $(OBJECTS) -o [email protected] 

file1.o : file1.cpp 
file2.o : file2.cpp 
file3.o : file3.cpp 

.PHONY: clean 
clean: 
    rm -f $(EXECUTABLE) *.o core* 

я получил следующее ERR после того, как я побежал «сделать»: г ++: не file3.o: нет такого файла или каталога

у меня есть обходной путь, чтобы добавить фиктивный файл после file3:

dummy.o : dummy.cpp 

Этот способ я мог бы успешно построить.

И я знаю, что я могу удалить все эти строки:

file1.o : file1.cpp 
file2.o : file2.cpp 
file3.o : file3.cpp 

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

Я также попытался просто переименовать «Makefile» в «Makefile», и со следующими линиями без фиктивной линии:

file1.o : file1.cpp 
file2.o : file2.cpp 
file3.o : file3.cpp 

К моему удивлению, я мог бы построить успешно этот путь.

Может ли кто-нибудь объяснить, почему я получил ошибку «Нет такого файла или каталога» для последнего файла3 в начале?

Ниже приводится вывод ошибок: после того, как я добавил фиктивную линию

g++ -g -Wall -O -I/usr/local/include -I/usr/include  -c -o file1.o file1.cpp 
g++ -g -Wall -O -I/usr/local/include -I/usr/include  -c -o file2.o file2.cpp 
g++ -g -Wall -O -I/usr/local/include -I/usr/include -I/usr/local/include -I/usr/include -L/usr/local/lib -L/usr/lib64 -lsybdb file1.o file2.o file3.o -o mybin 
g++: file3.o: No such file or directory 
make: *** [mybin] Error 1 

Ниже выхода:

g++ -Wall -g -O -I/usr/local/include -I/usr/include  -c -o file1.o file1.cpp 
g++ -Wall -g -O -I/usr/local/include -I/usr/include  -c -o file2.o file2.cpp 
g++ -Wall -g -O -I/usr/local/include -I/usr/include  -c -o file3.o file3.cpp 
g++ -Wall -g -O -I/usr/local/include -I/usr/include -I/usr/local/include -I/usr/include -L/usr/local/lib -L/usr/lib64 -lsybdb file1.o file2.o file3.o -o mybin 

Я попытался переименовать «Makefile» в «Makefile» снова, и это Безразлично На этот раз не работай.

+3

Вы можете показать нам * точный * вывод из запуска 'make', когда он терпит неудачу? –

+0

@wallyk Нет, если это была проблема, вы увидели бы что-то вроде 'make: *** Нет правила делать target \' file3.o '. Stop.' Эта ошибка означает, что 'g ++' не может найти 'file3.o', который звучит так, будто он не смог правильно создать. –

+0

Невозможно воспроизвести вашу проблему –

ответ

0

Ufffff !! Нашел вашу проблему.

Когда вы писали

file1.o : file1.cpp 
file2.o : file2.cpp 
file3.o : file3.cpp 

в ваших makefile демон пришел и ввел TAB после строки file3.o : file3.cpp так что вместо того, чтобы неявные думал, что вы задаете явное правило. Для file1.o и file2.o он использовал неявное правило, но для file3.o он предположил, что вы указали явное правило из-за этого TAB, но вы дали ему пустую табуляцию, так что file3.o так и не был построен.

Теперь, когда вы добавили dummy.o:dummy.cpp, табуляция была перемещена ниже этой строки, поэтому был составлен file3.o. Когда вы экспериментировали вокруг, вы удалили эту TAB, поэтому переименование makefile на Makefile, похоже, сработало.

Просто FYI: нет никакой разницы между Makefile или makefile как трактуются одинаково по маркам, кроме случаев, когда оба Makefile и makefile файлы находятся там в той же папке, и вы даете сделать то makefile выполняется вместо Makefile

+0

Да, это причина. Вы так добросовестны, спасибо большое! – user41662

Смежные вопросы