如何创建将对象代码放在不同文件夹中的makefile

时间:2017-11-17 18:57:05

标签: makefile

我是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

请这是最后一个问题。

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