C++ 为我的程序使用make

C++ 为我的程序使用make,c++,ubuntu,makefile,C++,Ubuntu,Makefile,我在不同的文件夹中有一堆文件: /ai/client.cpp # contains the main function /ai/utils/geometry.h /ai/utils/geometry.cpp /ai/world/world.h /ai/world/world.cpp /ai/world/ball.h /ai/world/ball.cpp /ai/world/bat.h /ai/world/bat.cpp /ai/client.cpp#包含主要功能 /ai/utils

我在不同的文件夹中有一堆文件:

/ai/client.cpp # contains the main function /ai/utils/geometry.h /ai/utils/geometry.cpp /ai/world/world.h /ai/world/world.cpp /ai/world/ball.h /ai/world/ball.cpp /ai/world/bat.h /ai/world/bat.cpp /ai/client.cpp#包含主要功能 /ai/utils/geometry.h /ai/utils/geometry.cpp /ai/world/world.h /ai/world/world.cpp /ai/world/ball.h /ai/world/ball.cpp /ai/world/bat.h /ai/world/bat.cpp 如何编写makefile来编译此程序?我在用Ubuntu

  • 您应该检查您是否已安装了g++build-essential
  • 是关于makefile黑魔法联盟的一些见解
  • 我认为make是目录感知的,所以键入mydirectory/myfile.cpp应该可以很好地工作
  • 剩下的是基本的g++命令,但是关于1的教程应该足够了:)
  • 执行makefile的程序是一个多功能的工具,使用它有许多不同的微妙之处。但是,您可以保持简单:

    OBJ := ai/utils/geometry.o ai/world/world.o ai/world/ball.o ai/world/bat.o
    
    all: ai/client
    .PHONY: all  # specific to GNU make, which is what Ubuntu provides
    
    ai/client: ai/client.o $OBJ
    
    # this rule means each .cpp file depends on its corresponding header
    # and, since the .o files depend on .cpp files (a builtin make rule),
    # they will be recompiled if the headers change
    #
    # you can also get more complex and generate dependencies automatically
    # look at the -MM option for gcc, for example
    %.cpp: %.h
    
    谷歌的第一个结果:


    这似乎是一个很好的教程。应该很容易理解,注意他们谈论的是make的GNU版本,这是最常用的。如果您使用基于BSD的操作系统(如OpenBSD、NetBSD或FreeBSD),也有BSD版本。有人知道Mac OSX吗?

    它的工作原理谢谢大家1的宝贵意见 特别为链接 在上一篇文章中,我忘记在第6行编写client.cpp文件
    但我的错误是,我在client.cpp中包含了一个带有错误的标题,而它永远也找不到它。

    您自己有没有努力回答这个问题?解释并展示你自己最好的回答方式。否则谷歌“makefile教程”。别忘了这个网站是为编程大师而设的,如果你还没有编写你的第一个OS a.k.a.操作系统,别指望能为你找到任何答案:)。。。当然,我是在开玩笑,但是(在任何地方)都欢迎表现出一些基本的努力。我完全不同意。根据FAQ,“没有任何问题是太琐碎或太“新手”的,并且“欢迎您的问题,只要至少有一个其他程序员感兴趣”。这个网站的全部要点是,人们有一个地方可以找到他们编程问题的答案,他们在这里找到的答案是合理的、最新的和高质量的。谷歌没有提供这两种服务。在这里提问之前,绝对没有必要搜索谷歌。(不过,我们绝对建议对SO进行搜索)这个问题可以使用更多的细节,比如OP知道什么(如果有的话)、他做了什么(或没有做过什么)、这项工作是如何失败的,以及他被困在了哪里。并不是因为初学者的问题是个问题,而是因为目前我们真的不知道如何回答…@jalf,他没有搜索:dups:note在第二个问题上,投票率最高的答案是发布谷歌的第一个结果。lmgtfy.com是一个禁止链接,因为它被认为是冒犯性的。将其隐藏在URL缩短器后面是糟糕的两倍。不要那样做。您更新的链接要好得多。如果有一个警告,我不记得在这种情况下适用:如果您的make默认是使用CC链接(这可能意味着GCC命令),您可能需要在Mag文件中<代码> cc:= g++< /C>以链接到C++ STDLIB。(或者类似的东西,但是如果您没有使用此makefile编译的C程序,这就足够了)。@Roger:gnumake应该使用
    $(CXX)默认情况下编译C/C++代码,默认为“代码> G++<代码>。不要告诉C编译器使用<代码> G++<代码>!@ DMCKE:编译,是的,但问题是链接。在我的Ubuntu VM上,使用(如通过代码>见-P-代码/代码>)CC链接所有*.o文件,不管它们来自C或C++源文件。我是否丢失了一个配置设置?@罗杰:呃…呃……我以前从来没有注意到。我习惯地提供一个明确的链接规则,所以它从来没有出现过。我只是在犹豫。我想你最好不要理会以上歇斯底里的咆哮。我要去。喝杯啤酒。你的意思是,你实际上不知道答案,但却在无意识地模仿谷歌,希望你找到的结果是正确的。这对OP有什么帮助?如果你的意思是我不会给他们一个完整编码的makefile,让他们可以复制粘贴,那么是的。我已经复习了那个教程,很好。我不是g我想尝试总结一下,因为make太复杂了,无法在这些小答案中解释。我希望提问者理解给出的代码,而不是盲目地复制和粘贴。虽然我同意你的其他观点,但一个他可以复制和粘贴的实际工作示例是对一个好教程的极好补充(最好的教程包括工作示例本身)。能够在阅读过程中修改和尝试某些内容对于某些人的学习至关重要。