【问题标题】:Makefile with an Implementation and Header Files带有实现和头文件的 Makefile
【发布时间】:2020-05-05 05:29:33
【问题描述】:

我在这里看到的每个问题都涉及比我更复杂的用例。

我正在上一年级的编程课程,但我无法理解我做错了什么。运行 make 时,我只收到一条 Circles is up to date 消息。

我有三个文件:

main.cpp => 程序的入口点

CircleDriver.cpp => 一个实现文件

circle.h => 包含头文件类的头文件。

main.cpp 依赖于 CircleDriver.cpp 和 circle.h,CircleDriver.cpp 依赖于 circle.h

目前我的 Makefile 看起来像这样:

Circles: main.o
    g++ -std=c++11 -g -Wall main.o -o Circles

main.o: main.cpp
    g++ -std=c++11 -g -Wall -c main.cpp CircleDriver.cpp

clean:
    rm *.o Circles

我读到您不需要在编译命令中包含头文件,但添加其他 .cpp 文件并没有解决我的问题。

我确信这是一个简单的问题,但是大约 30 分钟的谷歌搜索没有产生任何结果。

提前谢谢你。

【问题讨论】:

  • 看起来你需要一个额外的规则(但更喜欢一个更通用的规则来代替main.o: main.cpp)来处理CircleDriver。也许g++ -std=c++11 -g -Wall -c main.cpp CircleDriver.cpp 会用它做点什么,但我从未尝试过(或几十年前尝试过),所以我不知道会发生什么(或忘记了什么)。
  • 您的规则说main.o 仅依赖于main.cpp,但事实并非如此,因为它也使用CircleDriver.cpp。另外,我猜你可能需要一些头文件来更新你的规则。

标签: c++ makefile


【解决方案1】:

我通常为我的 Makefile 做这样的事情:

%.o: %.cpp
    g++ -c -o $@ $< -std=c++11 -Wall

Circles: main.o CircleDriver.o
    g++ -o $@ $^ -std=c++11 -Wall

clean:
    rm *.o *~

这将为每个 .cpp 文件创建目标文件,然后使用目标文件制作圆。

【讨论】:

  • 你能解释一下这是如何工作的吗?
  • 正确的方法,但只有代码的答案。这很容易通过一点解释来挽救,特别是所有奇怪的$@$&lt;$^ 的意思。除非你already know where to look,否则它几乎无法通过谷歌搜索。
  • 出于某种原因,这让我回到了与上一个 Makefile 类似的位置。 CircleDriver.cpp 没有正确更新,因为它在意外点退出(比如我在完成相关方法之前编译时)
  • 这不太正确,因为目标文件不依赖于 circle.h。所以你想要的是%.o: %.cpp circle.h 或更通用的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-27
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多