g++编译makefile有点麻烦
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:\DevProjectsnd-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
除了 .cpp 文件包含匹配的 .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
关于您在上面看到的一些内容的一些注释,使规则更易于编写:
$@
是表示规则目标的宏
$^
是一个扩展为当前目标的 所有 依赖项的宏,删除了重名。
$<
是扩展到 first 依赖项的宏。
还有很多 can/should 需要完成(依赖项生成、隐式规则使用、虚假目标等),但这是它的基础。
我有以下 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:\DevProjectsnd-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
除了 .cpp 文件包含匹配的 .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
关于您在上面看到的一些内容的一些注释,使规则更易于编写:
$@
是表示规则目标的宏$^
是一个扩展为当前目标的 所有 依赖项的宏,删除了重名。$<
是扩展到 first 依赖项的宏。
还有很多 can/should 需要完成(依赖项生成、隐式规则使用、虚假目标等),但这是它的基础。