2011-05-22 65 views
10

我看到GCC有一個行爲一個-include 文件選項(排序)之類的文件的第一行是爲什麼gcc有一個-include選項?

#include "file" 

什麼是這個選項一些很好的用途?

+0

海灣合作委員會有一堆奇怪的選擇。這就是開源軟件的奇蹟。 – 2011-05-22 16:49:51

+1

我繼續前進,重新提出了這個問題。希望它不會再將人們視爲「主觀的和議論性的」。那不是我的意圖。 – andrewdski 2011-05-22 17:29:55

+1

我認爲這是一個合理的問題。但即使在這裏使用「好」這個詞也會讓你陷入困境。 – 2011-05-22 17:33:03

回答

1

對於像項目中所有文件包含的前綴頭文件這樣的東西很有用 - 有點像Windows中可怕的StdAfx.h或Mac OS上的.prefix.h文件。

6

-include選項的一個實際應用是在Linux內核構建系統中。

在構建Linux內核時,可以運行大量配置選項菜單來定製構建的內核。舉例來說,這裏是你是否要支持多個CPU內核的x86架構,爲Linux 3.0內核配置選項:

config SMP 
     bool "Symmetric multi-processing support" 
     ---help--- 
      This enables support for systems with more than one CPU. If you have 
      a system with only one CPU, like most personal computers, say N. If 
      you have a system with more than one CPU, say Y. 
      [...] 

中的源代碼,這個選項會顯示爲一個預處理符號, CONFIG_SMP。當多個處理器需要不同的代碼時,內核和驅動程序中的源代碼可以執行#ifdef CONFIG_SMP。 (它也可以在Makefile內使用,使用不同的語法來選擇是否編譯.c文件或子目錄。)

這些預處理符號是如何定義的?它們沒有在編譯器命令行上定義,因爲它會非常漫長(典型的分發內核中有幾千個這樣的符號;我在這臺機器上運行的內核數量超過了4000個)。相反,所有這些選項都會自動生成一個神奇的頭文件。這個頭文件然後通過-include include/generated/autoconf.h選項自動包含在所有編譯的文件中。

由於CONFIG_預處理器符號應該在所有內核源代碼文件的所有位置都可用,因此使用-include(在文件的第一行之前隱式包含它)是一件好事。沒有它,你會做下列之一:

  • 明確包括它作爲第一個包含上千種內核源代碼文件的每一個文件,希望大家都不忘記把它列入或增加了一些之前包括。
  • 明確包括它在一個常用的標題(如kernel.h),並希望沒有這取決於CONFIG_符號的第一直接或間接包含該頭的前面。

這些選項中的任何一個明顯都不如-include

在Linux內核上有另一種使用-include,但它更深奧。內核部分(尤其是啓動代碼的早期部分)必須以實模式運行。與過去一樣,彙編程序不是像彙編程序那樣完全編寫代碼,而是指示彙編程序發出32位實模式代碼(.code16gcc)。這是一定要做的源代碼的第一件事,先天下之憂,這使它成爲一個偉大的比賽,以-include(頭包括這一次只有一個asm(".code16gcc");語句)。

1

它可以在編譯時以類似於庫在運行時預加載的方式使用:臨時覆蓋源文件中的某些內容。例如,如果您希望支持比系統上的glibc版本舊的glibc,那麼可以使用它來包含覆蓋默認glibc符號版本的頭文件。

0

我的這兩個仙: 我碰巧使用-include指令和「編譯時」自動生成的頭文件。 這樣,您的代碼就可以在默認情況下工作,並且不會污染可能存在或不存在的文件(例如依賴性計算會抱怨),但您可以根據外部配置修改代碼行爲。

相關問題