我是Makefile的新手。我构建了以下makefile(哪些不起作用)。我不想将genarated对象代码放在不同的文件夹中(该文件夹在当前目录中)。
$ ls
main.cpp Makefile object_code Time.cpp Time_.h
我该怎么做?
VER = Debug
CC = g++
OBJECTFIELS = ./object_code/main.o ./object_code/Time.o
../$(VER)/main: $(OBJECTFIELS)
$(CC) $(OBJECTFIELS) -o $@
$(OBJECTFIELS): Time_.h
./object_code/main.o: main.cpp
./object_code/Time.o: Time.cpp
clean:
rm $(OBJECTFIELS) main
这是错误。
$ make
g++ ./object_code/main.o ./object_code/Time.o -o ../Debug/main
g++: error: ./object_code/main.o: No such file or directory
g++: error: ./object_code/Time.o: No such file or directory
g++: fatal error: no input files
compilation terminated.
Makefile:8: recipe for target '../Debug/main' failed
make: *** [../Debug/main] Error 1
请这是最后一个问题。
答案 0 :(得分:0)
我没有看到你如何根据你在这里发布的makefile获得那个输出。
目标文件已经存在,在这种情况下链接将成功而不是打印该错误。
或者目标文件不存在,在哪种情况下make会抱怨,因为它不知道如何制作它们。您正在使用的makefile与您在此处发布的makefile之间必定存在一些差异。
无论如何,make知道如何从文件foo.o
为任何字符串foo.cpp
构建文件foo
。有一个内置规则告诉它如何做到这一点。
但是,无论./object_code/foo.o
如何,make都不知道如何从文件foo.cpp
构建文件foo
。没有内置规则告诉如何在一些随机其他目录中构建目标文件。如果你想让make这样做,你必须告诉它如何。你应该删除这些行:
./object_code/main.o: main.cpp
./object_code/Time.o: Time.cpp
并用pattern rule替换它们,描述如何将目标文件构建到object_code
目录中(我在这里使用CXX
作为编译器变量:按惯例CC
是C编译器,CXX
是C ++编译器,你应该始终坚持使用约定,除非有充分的理由不这样做:
VER = Debug
CXX = g++
OBJECTFIELS = ./object_code/main.o ./object_code/Time.o
../$(VER)/main: $(OBJECTFIELS)
$(CXX) $(OBJECTFIELS) -o $@
$(OBJECTFIELS): Time_.h
./object_code/%.o : %.cpp
$(CXX) -c -o $@ $<
clean:
rm $(OBJECTFIELS) main