回答
我想你正在談論使用的配置腳本,當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