繁体   English   中英

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:\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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM