回答
我想你正在谈论使用的配置脚本,当autotools用于构建项目。
configure
文件的主要目的是生成适合您的系统配置的Makefiles
并检查各种先决条件(例如安装的库)。
我们什么时候需要检查前提条件,我们可以在运行时检测它吗? – wireshark 2011-04-27 08:32:49
假设一个特定的编译器在一个操作系统上可用,而另一个在另一个操作系统上可用。构建你的程序的命令(也就是生成文件)对于每个操作系统都必须有所不同。配置文件的工作是检测这些差异并为您的系统生成适当的makefile。 – Jaywalker 2011-04-27 08:37:27
@wireshark:它也可以检查你的系统上是否安装了合适的库(以防止以后出现编译或链接错误),根据需要获取一些系统信息(主机名,版本等),找到特定可执行文件的路径(例如,lex),检查一些使用的工具是否支持特定的选项。 – beduin 2011-04-27 08:44:20
A configure
脚本是构建使用GNU autotools的项目的倒数第二步。 Autotools是一套工具,旨在最大限度地提高各种POSIX和POSIX类操作环境之间应用程序的可移植性,这些环境可能在应用程序需要的基本集之外具有稍微不同的功能。
TL; DR:configure
当您希望在许多不同的操作系统之间移植时很重要。
你可以给一个小例子来说明'configure'如何实现便携吗? – wireshark 2011-04-27 08:29:43
'configure'本身不能。生成它的工具以及这些工具使用的模板文件是使应用程序可移植的原因。 – 2011-04-27 08:31:34
配置由autoconf从GNU Autotools生成。您可以使用autoconf和automake来管理项目的构建系统;如果您不想或不能依赖您的IDE,autotools是管理构建和安装代码的另一种方式。操作系统的可移植性是他们帮助的另一个主要事情,尽管主要是在不同的基于UNIX的系统之间,这不再是一个问题。
更简洁地说,如果您厌倦了手工编辑Makefiles或需要跳出IDE,请考虑使用Autotools或其替代品之一,如CMake或SCons。
一个configure
脚本主要有三个目的:
- 检测可用性可选库(或用户偏好),或检查的存在和需要利用强制库中的正确选择你的程序依赖于。
- 解决标准库函数丢失或不符合标准规定的操作系统的问题。
- 通过检测您不应该关心的系统参数并将它们报告给您的程序,解决程序中不可行的假设。
目的3对于正确书写的代码一直没有用。例如,没有理由需要在预处理器级别知道sizeof(int)
。如果你想要一个特定的大小,使用一个固定大小的整数类型,如int32_t
(并且作为第2点的一部分,配置可以修补损坏的系统)。同样,你也不应该编写这样的程序,其行为取决于malloc(0)
是否返回NULL
或者“可以成功传递给free
的唯一指针”。 (是的,有很多实际上关心的破碎软件!)
目的2对于基本系统软件的GNU版本变得如此无处不在,通过支持大量专有的Unices和破坏的编译器和库,以及提供比原生工具通常提供的质量更好的质量,历史上非常重要。现在,每一个类似Unix的系统都有构建和运行时环境,它们完全或几乎符合POSIX标准,你可以通过-D_POSIX_C_SOURCE=(version goes here)
获得它们,并且还可以为shell的东西添加$PATH
。因此,目标2现在通常已经过时并且有害,除非您尝试支持Windows之类的非POSIX系统(没有cygwin)。
目的1仍然非常相关,并且不会很快消失。
有些项目可能有很好的理由,不喜欢GNU autotools并拒绝使用它,或者省略configure
或自己滚动。如果你只需要configure
作为第一个目的,这种方法可能是有意义的,如果你明白所有潜在的麻烦并且知道如何编写可移植的shell脚本。但是,如果您这样做,请务必学习并遵循所有的configure
惯例,以了解选项(如--enable-*
,--prefix
等)和变量(CFLAGS
,CPPFLAGS
等)的工作方式,以便您不会产生恶梦为用户。并且记住使用autoconf可能会更简单并且值得做 - 但是请避免浪费所有人的时间检查诸如sizeof(int)
之类的愚蠢的东西,或者是否适用于Fortran编译器。
- 1. 我什么时候需要分配财产,什么时候不需要?
- 2. Application.DoEvents,什么时候需要,什么时候不需要?
- 3. 什么时候需要分配类?
- 4. 什么时候需要CAMLparamX?
- 5. 什么时候需要pygame.init()?
- 6. 什么时候需要NSCopying?
- 7. 什么时候需要NS_RETURNS_RETAINED?
- 8. 什么时候需要“javascript:...”?
- 9. 什么时候需要TransactionScopeOption.Supress?
- 10. 什么时候需要dynamic_cast?
- 11. 什么时候需要curl_global_init()?
- 12. 我们什么时候需要在nginx配置文件中使用http块?
- 13. 什么时候项目不需要应用程序架构师?
- 14. 什么时候需要配置db连接
- 15. 什么时候使用GWT,什么时候不需要
- 16. 我什么时候需要mapbox.js?
- 17. 我什么时候需要调用XInitThreads?
- 18. 我什么时候需要使用@WebServiceRef?
- 19. 我什么时候需要更改serialVersionUID?
- 20. 我什么时候需要声明session_start();?
- 21. String :: ShellQuote:我什么时候需要`shell_quote`?
- 22. 什么时候需要实现INotifyPropertyChanged?
- 23. 什么时候需要(“哪个”)出生?
- 24. 我什么时候需要InamingContainer接口?
- 25. 什么时候在C++中需要'int'?
- 26. 什么时候你需要导入PHP?
- 27. 什么时候需要引用document.getElementByID?
- 28. 什么时候需要使用ng-template?
- 29. 我什么时候需要使用MPI_Barrier()?
- 30. 我什么时候需要使用“android:id”?
也许它包含CMakeLists.txt? – Begemoth 2011-04-27 08:28:36
我觉得没有。 CMakeLists.txt用于cmake构建系统。 configure文件通常由'autotools'使用。 – beduin 2011-04-27 08:29:46
@Begemoth,不,只有'Makefile' .. – wireshark 2011-04-27 08:31:03