非常奇怪的 makefile 问题,没有那个文件或目录
Very strange issue of makefile, No such file or directory
我遇到了一个非常难运行ge 的 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: 没有那个文件或目录
我有一个解决方法,可以在文件 3 之后添加一个虚拟文件:
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
令我惊讶的是,我可以这样构建成功。
谁能解释为什么我在开头的最后一个文件 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",这次不行
呜呜!!找到您的问题。
当你写
file1.o : file1.cpp
file2.o : file2.cpp
file3.o : file3.cpp
在您的 makefile
中,一个守护进程出现并在 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
我遇到了一个非常难运行ge 的 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: 没有那个文件或目录
我有一个解决方法,可以在文件 3 之后添加一个虚拟文件:
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
令我惊讶的是,我可以这样构建成功。
谁能解释为什么我在开头的最后一个文件 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",这次不行
呜呜!!找到您的问题。
当你写
file1.o : file1.cpp
file2.o : file2.cpp
file3.o : file3.cpp
在您的 makefile
中,一个守护进程出现并在 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