[英]Very strange issue of makefile, No such file or directory
我遇到了一個很奇怪的makefile問題,它是:系統:Linux CentOS 6最初,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 $@
file1.o : file1.cpp
file2.o : file2.cpp
file3.o : file3.cpp
.PHONY: clean
clean:
rm -f $(EXECUTABLE) *.o core*
我運行“ make”后得到以下錯誤:g ++:file3.o:沒有這樣的文件或目錄
我有一個解決方法,可以在file3之后添加一個虛擬文件:
dummy.o : dummy.cpp
這樣我可以成功構建。
而且我知道我可以刪除所有這些行:
file1.o : file1.cpp
file2.o : file2.cpp
file3.o : file3.cpp
讓make使用默認設置進行構建,這樣我就可以成功構建。
我還嘗試將“ makefile”重命名為“ Makefile”,並使用以下幾行沒有偽行:
file1.o : file1.cpp
file2.o : file2.cpp
file3.o : file3.cpp
令我驚訝的是,我可以通過這種方式成功構建。
誰能解釋為什么我在開始的最后一個file3上出現“沒有這樣的文件或目錄”錯誤?
錯誤輸出如下:
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”,但這次不起作用。
f! 找到了你的問題。
當你寫
file1.o : file1.cpp
file2.o : file2.cpp
file3.o : file3.cpp
在您的makefile
一個file3.o : file3.cpp
進程來了,並在file3.o : file3.cpp
行之后引入了TAB,因此make而不是采用隱式規則,以為您指定了顯式規則。 對於file1.o
和file2.o
它使用隱式規則,但是對於file3.o
它假定您正因為該TAB而指定了顯式規則,但是您給了它空白TAB,所以從未構建過file3.o
。
現在,當您添加了dummy.o:dummy.cpp
,TAB移至該行下方,因此已編譯file3.o
。 當您進行實驗時,刪除了TAB,這就是將makefile
重命名為Makefile
似乎可行的原因。
僅供參考: Makefile
或makefile
之間沒有任何區別,兩者都由make平等對待,除非當Makefile
和makefile
文件都位於同一文件夾中並且您給出make然后執行makefile
而不是Makefile
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.