簡體   English   中英

Makefile非常奇怪的問題,沒有這樣的文件或目錄

[英]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.ofile2.o它使用隱式規則,但是對於file3.o它假定您正因為該TAB而指定了顯式規則,但是您給了它空白TAB,所以從未構建過file3.o

現在,當您添加了dummy.o:dummy.cpp ,TAB移至該行下方,因此已編譯file3.o 當您進行實驗時,刪除了TAB,這就是將makefile重命名為Makefile似乎可行的原因。

僅供參考: Makefilemakefile之間沒有任何區別,兩者都由make平等對待,除非當Makefilemakefile文件都位於同一文件夾中並且您給出make然后執行makefile而不是Makefile

暫無
暫無

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

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