我遇到了一个非常奇怪的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
令我惊讶的是,我可以通过这种方式成功构建。
有人可以解释为什么我在开头的最后一个文件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" to" Makefile"再次,这次没有工作。
答案 0 :(得分:1)
Ufffff !!找到了你的问题。
当你写
时file1.o : file1.cpp
file2.o : file2.cpp
file3.o : file3.cpp
在你的makefile
一个deamon来了,并在行file3.o : file3.cpp
之后引入了一个TAB,所以不要采用隐式规则,而是认为你正在指定显式规则。对于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