【问题标题】:When does an c/c++ project need a configure file?c/c++ 项目什么时候需要配置文件?
【发布时间】:2011-08-13 15:52:22
【问题描述】:

我看到的几乎每个 c/c++ 开源项目都附带一个 configure 文件。

但是在我们自己的c/c++项目中我至今没见过这个文件,

什么时候需要?

【问题讨论】:

  • 也许它包含 CMakeLists.txt?
  • 我认为没有。 CMakeLists.txt 用于 cmake 构建系统。 configure 文件通常由 autotools 使用。
  • @Begemoth,不,只有Makefile..
  • 强烈推荐阅读关于自动工具的易于理解的维基百科文章。 en.wikipedia.org/wiki/GNU_Autotools

标签: c++ c configure


【解决方案1】:

configure 脚本主要用于三个目的:

  1. 检测可选库的可用性(或用户偏好),或检查是否存在以及使用程序所依赖的强制库所需的正确选项。
  2. 解决标准库函数缺失或行为不符合标准规定的损坏操作系统。
  3. 通过检测您不应该关心的系统参数并将它们报告给您的程序来解决您的程序中损坏的不可移植假设。

目的 3 对于正确编写的代码一直没有用处。例如,您没有理由需要在预处理器级别知道sizeof(int)。如果您想要特定大小,请使用固定大小的整数类型,如int32_t(作为第 2 点的一部分,configure 可以修补缺少它的损坏系统)。同样,您不应编写行为取决于malloc(0) 返回NULL 还是“可以成功传递给free 的唯一指针”的程序。 (是的,有很多损坏的软件实际上在乎!)

Purpose 2 在历史上对基本系统软件的 GNU 版本变得如此普遍非常重要,它支持大量带有损坏的编译器和库的专有 Unices,并提供比本机工具通常所能提供的更好的质量。如今,每一个类 Unix 系统都有完全或几乎符合 POSIX 的构建和运行时环境,您可以通过 -D_POSIX_C_SOURCE=(version goes here) 获得它们,并可能在 $PATH 中添加一些用于 shell 的东西。因此,目的 2 现在通常已过时且有害,除非您尝试支持非 POSIX 系统,如 Windows(没有 cygwin)。

目的 1 仍然非常重要,而且不会很快消失。

有些项目,可以说是有很好的理由,不喜欢 GNU 自动工具并拒绝使用其中的任何一个,要么省略 configure,要么自己滚动。如果您只需要configure 用于第一个目的,那么这种方法可能是有意义的,如果您了解所有潜在的麻烦并知道如何编写可移植的 shell 脚本。但是,如果您这样做,请务必学习并遵循所有configure 约定,以了解选项(如--enable-*--prefix 等)和变量(CFLAGSCPPFLAGS 等)如何处理。 ) 工作,因此您不会为用户制造噩梦。请记住,使用 autoconf 可能更容易且值得一试 - 但请避免浪费每个人的时间让它检查诸如 sizeof(int) 之类的愚蠢事情或 Fortran 编译器是否有效。

【讨论】:

    【解决方案2】:

    配置由 GNU Autotools 中的 autoconf 生成。您可以使用 autoconf 和 automake 来管理项目的构建系统;如果您不想或不能依赖您的 IDE,自动工具是另一种管理构建和安装代码的方式。操作系统的可移植性是他们帮助的另一件重要事情,尽管主要是在不同的基于 UNIX 的系统之间,这已经不是什么大问题了。

    更简洁地说,如果您厌倦了手动编辑 Makefile 或需要突破 IDE,请考虑使用 Autotools 或其替代品之一,例如 CMake 或 SCons。

    【讨论】:

      【解决方案3】:

      我认为您是在谈论使用 autotools 构建项目时使用的配置脚本。

      configure 文件的主要目的是生成适合您的系统配置的Makefiles 并检查各种前提条件(例如已安装的库)。

      【讨论】:

      • 什么时候需要检查前置条件,必要时可以在运行时检测到吗?
      • 假设一个特定的编译器在一个操作系统上可用,而另一个编译器在不同的操作系统上可用。构建程序(以及因此生成文件)的命令对于每个操作系统都必须不同。配置文件的工作是检测这些差异并为您的系统生成适当的 makefile。
      • @wireshark:它还可以检查您的系统上是否安装了适当的库(以防止以后出现编译或链接错误),如果需要(主机名,版本等)获取一些系统信息,找到特定可执行文件的路径(例如 lex),检查一些使用的工具是否支持特定选项。
      【解决方案4】:

      configure 脚本是构建使用GNU autotools 的项目的倒数第二步。 Autotools 是一组工具,旨在最大限度地提高应用程序在各种 POSIX 和类 POSIX 操作环境之间的可移植性,这些操作环境在应用程序所需的基本集之外可能具有略微不同的功能。

      TL;DR:configure 在您希望在许多不同操作系统之间实现可移植性时很重要。

      【讨论】:

      • 你能举一个小例子来说明configure是如何实现便携的吗?
      • configure 本身不能。生成它的工具以及这些工具使用的模板文件使应用程序具有可移植性。
      【解决方案5】:

      当您手动创建 Makefile 变得过于复杂时。

      【讨论】:

      • 这是 Automake 和 CMake 的工作,而不是 autoconf。
      猜你喜欢
      • 2012-12-05
      • 2022-11-28
      • 2011-04-22
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      • 2017-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多