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 需要完成(依赖项生成、隐式规则使用、虚假目标等),但这是它的基础。