[英]A little trouble with g++ compiling makefile
我有以下makefile
:
test_containers: containers.o
g++ out/containers.o test/test_containers.cpp -o out/test_containers.exe
containers.o: queue.o stack.o container.o
g++ -c out/queue.o out/stack.o out/container.o -o out/containers.o
queue.o: container.o
g++ -c src/Queue.cpp out/container.o -o out/queue.o
stack.o: container.o
g++ -c src/Stack.cpp out/container.o -o out/stack.o
container.o:
g++ -c src/Container.cpp -o out/container.o
问题是,当我make containers.o
时, out/containers.o 没有出现。
编译日志:
D:\DevProjects\2nd-semester\cpp\S1_dev>make containers.o
g++ -c src/Container.cpp -o out/container.o
g++ -c src/Queue.cpp out/container.o -o out/queue.o
g++: warning: out/container.o: linker input file unused because linking not done
g++ -c src/Stack.cpp out/container.o -o out/stack.o
g++: warning: out/container.o: linker input file unused because linking not done
g++ -c out/queue.o out/stack.o out/container.o -o out/containers.o
g++: warning: out/queue.o: linker input file unused because linking not done
g++: warning: out/stack.o: linker input file unused because linking not done
g++: warning: out/container.o: linker input file unused because linking not done
有什么我不明白的吗? 我如何获得 containers.o 文件?
(在 Windows 10 机器上运行 btw)
更新:信息供应,因为人们说很少
我的文件树:
│ makefile
│
├───.vscode
│ settings.json
│
├───out
│ container.o
│ queue.o
│ stack.o
│
├───src
│ Container.cpp
│ Container.h
│ Queue.cpp
│ Queue.h
│ Stack.cpp
│ Stack.h
│
└───test
catch.hpp
test_containers.cpp
除了that.cpp 文件包括matching.h 文件,Queue.h 和Stack.h 都包括Container.h 和test_containers.cpp 文件包括catch,我真的不知道我还能说些什么。
您的食谱中塞满了不属于那里的文件。 鉴于您提供的信息量非常有限,最直接的解决方案是直接取消食谱。
test_containers: out/test_containers.exe
out/test_containers.exe: out/test_containers.o out/containers.a
g++ $^ -o $@
out/test_containers.o: test/test_containers.cpp
g++ -c $< -o $@
out/containers.a: out/queue.o out/stack.o out/container.o
ar rcs $@ $^
out/queue.o: src/Queue.cpp
g++ -c $< -o $@
out/stack.o: src/Stack.cpp
g++ -c $< -o $@
out/container.o: src/Container.cpp
g++ -c $< -o $@
clean:
rm -f out/*.o
关于你在上面看到的一些东西的一些注释,使规则更容易编写:
$@
是表示规则目标的宏$^
是一个扩展到当前目标的所有依赖项的宏,删除了重复的名称。$<
是扩展到第一个依赖项的宏。还有很多可以/应该做的事情(依赖生成、隐式规则使用、虚假目标等),但这是它的基础。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.