我有以下內容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
有什么我不明白的嗎?如何獲取 container.o 檔案?
(順便說一句,在 Windows 10 機器上運行)
upd:資訊供應,因為人們說資訊很少
我的檔案樹:
│ 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 之外,我真的不知道我還能說什么。
uj5u.com熱心網友回復:
你的食譜里堆滿了不屬于那里的檔案。鑒于您提供的資訊量非常有限,最直接的解決方案是直接抨擊食譜。
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
關于您在上面看到的一些內容的一些注釋,使規則更易于撰寫:
$@是一個宏,表示規則的目標$^是一個宏,它擴展到當前目標的所有依賴項,并洗掉了重復的名稱。$<是一個擴展到第一個依賴項的宏。
還有很多可以/應該做的事情(依賴生成、隱式規則使用、虛假目標等),但這就是它的基礎。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/429317.html
