【问题标题】:Makefiles, how can I use them? [closed]Makefile,我该如何使用它们? [关闭]
【发布时间】:2013-12-07 08:23:01
【问题描述】:

^这不是重复的问题^

更新

我对编程还很陌生,我现在才刚刚接触到 makefile。

在过去的几个月里,我从不同的地方下载了一堆教程和源代码;到目前为止,我一直只使用 VS 解决方案并一直在避免它们。

我在 google 上看到过多种使用 Makefile 的方法,但它们的复杂性各不相同……

我不知道它们或如何使用它们。谢谢。

编辑(重新措辞):

总而言之,由于明显的混淆,我的问题是(并且一直是):

1) Is there a good tutorial that comes recommended or is it easy to get started with Makefiles?
2) How do you launch and run an existing Makefile? And, 
3) Do Makefiles hold any vital data about the program or could I just use the `.h` and `.cpp` files that come with them in a new solution built from scratch?

【问题讨论】:

  • How to run makefile in Windows 的可能重复项
  • 更好的问题是:您为什么想要使用原始 Makefile?这是您的具体要求吗?
  • 请注意,在许多初学者情况下,您根本不需要编写任何 Makefile:GNU make 或 nmake(Visual Studio 附带)具有默认规则。因此,如果您的当前目录中有一个“a.cpp”文件,请尝试运行make anmake a.exe 或类似方法来构建它。
  • @thokra:Makefile 的一大优势:您可以了解 Visual Studio 项目文件倾向于隐藏的工具链。
  • 啊,我忘了。一些为 Linux 和其他 UNIX 衍生产品编写东西的人建议使用 MSYS 编译他们的 Makefile 项目,这是 MinGW 的一部分 - Cygwin 也是一种替代方案。他们让你编译所有东西不变,即你安装 MSYS 和 MinGW,打开一个 MSYS 控制台,基本上像在 Linux 上一样配置和编译项目。我一直讨厌那个...

标签: c++ makefile


【解决方案1】:

何时使用Makefile 是一个见仁见智的问题。当然,您可以使用一些替代的builder(例如omakeninja,但还有很多其他的)。只要您的软件中有多个translation unit,您肯定需要一些构建系统。如果使用makeMakefile 通过详细说明依赖关系来描述构建过程。通常,只需通过简单的make 命令即可构建程序。

阅读更多关于C++ programming 和一些C++ reference 的术语(也许还有C++11 标准n3337)。另见this draft 报告。

一些实用程序,例如cmakeqmakeautomake 等...是Makefile 生成器。它们生成一个复杂的Makefile,通常使用 GNU make 的所有功能。

如果你决定使用make,我推荐使用GNU make(这也是一个意见)。在这种情况下,请仔细阅读它的documentation,我觉得它非常易读,并且包含一个很好的教程。不要忘记使用最新版本:GNU make 4.0 版于 2013 年 10 月发布,并带来了许多有趣的新功能(插件,最重要的是通过guile 的可扩展性)对于复杂的构建很有趣。

要调试复杂的Makefile-s,请考虑使用remake(尤其是remake -x)。

在实践中,GNU make 有很多内置规则。您可以通过make -p 获得它们;所以使用它们。

您也可以选择为 POSIX make utility 编码(这是一个标准规范,但不如 GNU make 强大,后者可以配置为遵循 POSIX规范)。

如何编写Makefile 是个人品味和软件复杂性的问题。如果您有 2 或 3 个带有单个 .h 通用标头的 *.cc 文件,那么您不想要所有值得在软件上使用的花哨技巧(例如,GCC 和 make 提供的 automatic dependencies)数百个源文件(有时 C++ 源代码是由 ANTLRGNU bisonSWIGQt moc 或您自己的 metaprogramming 脚本生成的,因此构建系统必须知道这一点;例如,另请参阅RefPerSys)。

这里有一个小型 GNU Makefile 可以帮助您:

## file Makefile
CXX= g++
CXXSOURCES= main.cc other.cc
CXXOBJECTS= $(patsubst %.cc, %.o, $(CXXSOURCES))
OPTIMFLAGS= -g -O
PACKAGES= glib-2.0
PKGCONFIG= pkg-config
CXXFLAGS= -std=c++11 -Wall $(OPTIMFLAGS)
CPPFLAGS:=  $(shell $(PKGCONFIG) --cflags $(PACKAGES))
LIBES:= $(shell $(PKGCONFIG) --libs $(PACKAGES)) -ldl
.PHONY: all clean

all: myprog
myprog: $(CXXOBJECTS)
    $(LINK.cc) -rdynamic $^ $(LIBES) -o $@

$(CXXOBJECTS): yourheader.h

clean:
    $(RM) *.o *.so *.orig *~ myprog core* *.hh.gch
## eof Makefile

我不认为这是一个完美的例子(它不是)。请注意,表格对于make 很重要,我无法在上面输入它们。您将使用make all(或只是make)来构建您的程序,并使用make clean 来删除非源文件。

由于不明原因,有时Makefile 可能会使用autotoolscmake 生成。对于简单的程序,学习如何使用它们可能不值得。

在少数情况下 GNU make 不值得或不合适:在 MELT 我几乎放弃了使用它(通过调用一些 autogen 生成的 shell 脚本),因为它是一种引导语言,其中一组 C++ 文件从一组 MELT 文件中生成自身,因此您具有多对多的准循环依赖关系。可能使用 GUILE 扩展程序会有很大帮助。但这种噩梦般的情况很少见。

PS:我是作为 Linux 用户回答的;不知道什么适用于我从不使用的 Windows。另请参阅these hints,了解 Linux 上的 C 或 C++ 编程。

PS2:Paul Evans' answer 是相关的:不要自己写Makefile,复制一些现有的以满足您的需要。

【讨论】:

  • 好的,感谢您发布并提供大量信息。感谢您的宝贵时间。
【解决方案2】:

如果您要求一个好的教程,那么我认为this one 很好!你完全可以跟随它。我通过它学习了make文件。

【讨论】:

  • 太好了,谢谢。这是我回答的问题之一。
【解决方案3】:

开始推出自己的makefile 时,成功的基本概念是不要!始终获取一个类似的、简单的、工作 makefile 作为模板并将其更改为您自己的构建。只有在完成这项工作后,您才能通过勤奋的阅读和研究来寻找改进它的方法,使其更通用,。那么有一天可能会在遥远的遥远的未来到来,在那里你可以真正从头开始写一个makefile。但是,如果那一天永远不会到来,请不要失望。

【讨论】:

  • 那里的积极响应。我从没想过我会在编程方面走这么远,所以我暂时不会把它写下来。感谢发帖。
  • Makefile 很简单,可让您轻松编写各种编译过程的脚本。在很短的时间内学习从手册页编写 makefile 是完全可行的——比 C++ 容易得多!
  • 你应该简单地使用 VS 自己的构建系统。 Makefiles - 尽管功能强大 - 只是晦涩难懂,语法很糟糕,需要付出很多努力才能完全理解。这根本不值得。
  • 我同意 Paul 的观点,但我认为这是评论,而不是答案。这是一个意见,仅此而已。
  • 这不是我第一次阅读这样的建议(不要从零开始),我同意。虽然这当然可以解释我所见过的很多问题,而且我们都知道技术债务会发生什么......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-28
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
  • 2013-08-11
  • 2015-10-28
相关资源
最近更新 更多