前言
前段時間在寫 Linux 專欄的過程中,忽然想到一個問題 :C語言的頭文件路徑,因為在GCC環(huán)境下面,可以很直觀的了解到程序?qū)︻^文件的查找位置,但是對于使用集成開發(fā)環(huán)境 KEIL 或者 IAR 的朋友們來說,一些系統(tǒng)的庫文件路徑根本就不知道在什么地方。
所以本文我們就來聊一下 C 語言的頭文件路徑相關(guān)的問題 ,包括系統(tǒng)路徑位置,絕對路徑與相對路徑,正斜杠 /
與 反斜杠 \\
使用說明等。
我是矜辰所致,全網(wǎng)同名,盡量用心寫好每一系列文章,不浮夸,不將就,認真對待學(xué)知識的我們,矜辰所致,金石為開!
一、C語言中的頭文件引用
我們都知道,在我們 C 編程的時候,我們頭文件的引用使用的是 #include <>
或者 #include ""
,比如:
而且大家應(yīng)該都知道:
- include 使用雙引號" ",編譯器首先在當前目錄下查找頭文件,如果沒有找到,再到系統(tǒng)目錄下查找。
- include 使用尖括號< >,編譯器會到系統(tǒng)目錄下查找頭文件;
這里額外提一句,因為 使用雙引號" "如果在當前目錄找不到頭文件,最終還是會去系統(tǒng)路徑下尋找,所以頭文件包含,完全可以都使用雙引號" " ,至于實際中還是有很多使用 < > 和 " " 混搭,那是因為在確定是引用系統(tǒng)路徑的頭文件的時候,使用 < > 相對來說效率高那么一點點,省去了在當前目錄下面尋找的那一點時間。
對于使用雙引號" " 的當前目錄下查找,大家應(yīng)該都知道,就是與引用頭文件的.c
文件相同的目錄下,比如上面是 main.c
文件引用的,就是首先在與 main.c
相同的目錄中去查找。
那么對于 < > 從系統(tǒng)路徑中搜索,這個系統(tǒng)目錄到底在哪里呢?
二、KEIL 中的頭文件路徑
我們先從我們熟悉的 IDE 入手,用 KEIL 來說明一下。
2.1 IncudePaths 指定的路徑
在我們使用 KEIL 做項目的時候,都需要一個IncudePaths
,就是填寫頭文件路徑,如下圖所示:
KEIL4 上是51單片機的項目:
KEIL5 上是 STM32 的項目:
為了工程結(jié)構(gòu)框架,我們不可能把文件放在同一個目錄下面,所以需要進行額外的指定頭文件路徑,這里只要用過 KEIL 的朋友應(yīng)該都能明白。
對于 include 使用雙引號" "的頭文件,首先會在引用頭文件的.c
文件相同的目錄下去查找,如果查找不到,會在上面 IncudePaths
設(shè)置中所有設(shè)置過的目錄中去查找,這一點我們不多贅述。
絕對路徑和相對路徑
這里我們額外說明一個問題,絕對路徑與相對路徑。
在上面的示例圖中,我們可以看到,IncudePaths
里面所添加的路徑,都是 ../
開頭的,這種表示方式就是相對路徑。
使用相對路徑的好處是即便整個工程移動了位置,也無需修改什么設(shè)置,因為工程文件的相對位置沒有改變。
簡單復(fù)習(xí)下相對路徑的表示:
./
: 表示當前路徑../
:表示上一級目錄
絕對路徑就比較簡單了,絕對路徑就是直接從根部(盤符)開始表示的路徑,在 Windows 中,就是 C盤,D盤,這些,在 Linux 中,沒有盤符的說法,根部就是 /
,比如下面兩個都是絕對路徑的表示:
C:\\Keil\\C51 /home/qzh/linux
正斜杠 / 與 反斜杠 \\ 與雙斜杠
正好提到文件路徑,順帶把斜杠的問題也說一下,在上面示意圖中,我們可以看到,既有正斜杠,又有反斜杠:
對于路徑的表示 ( 聲明,這里只是針對文件路徑!路徑! ):
- Linux 中都使用正斜杠
/
. Linux下好理解,只能用正斜杠/
:/home/qzh/linux
. - 在Windows 中,稍微復(fù)雜一點 . 在Windows 中常用 反斜杠
\\
,比如我們隨便看一個系統(tǒng)顯示的路徑都是反斜杠\\
:
. 實際上,Windows 除了在一些特定的場合必須用反斜杠 \\
,在引用路徑的時候斜杠/
和反斜杠\\
可以互用的。
比如下面兩種方式的引用都是可以的:
#include "..\\led\\led.h"
#include "../led/led.h"
為了可移植性,引入頭文件時建議使用正斜杠/
:#include "../led/led.h"
不僅如此,在Windows下引用文件路徑的時候,正反雙斜杠//
、\\\\
與斜杠 /
、反斜杠\\
可以互用的,如下圖所示:
雙斜杠 :
在寫一些腳本或者程序的時候(上面是引用路徑的情況,這里額外提一下程序中的情況,程序中!程序中!),我們也經(jīng)常看到雙斜杠,比如:
C:\\\\Keil\\\\C51
這種路徑表示是為什么呢?
因為在大多編譯器中,\\
是一個轉(zhuǎn)義字符,例如\\n,\\r
,所以如果使用反斜杠 \\
,會使得路徑出問題,所以會寫成 \\\\
。
當然正如我們上面說過的,我們在程序中可以寫成 C:\\\\Keil\\\\C51
,當然也可以使用 斜杠 /
寫成C:/Keil/C51
。
2.2 include < > 搜索的系統(tǒng)路徑
額外提了那么多,回到我們的正題,來說說在 KEIL 中的 #include < >
的查找路徑。
比如我們在本文第一張示意圖上有一個應(yīng)用#include
,我們明確的告訴編譯器這個需要從系統(tǒng)路徑中去查找,這個 KEIL 所謂的系統(tǒng)路徑在什么地方呢?
這里我們也沒什么好分析的,直接告訴大家答案:
第一個基于51平臺的,使用的 51 的編譯器, #include < >
的查找路徑為“KEIL的安裝目錄”:\\Keil\\C51\\INC
,比如博主的KEIL安裝在C盤,這個路徑就是C:\\Keil\\C51\\INC
:
當然,我們可以簡單的做個試驗確認一下,我們可以在 KEIL 中先打開 這個頭文件:
然后我們打開C:\\Keil\\C51\\INC
目錄下的 MATH.h 文件,進行簡單的修改,然后看一下是否是同一個文件,如下圖:
那么對于 KEIL5 中的 STM32 中如果使用 #include < >
,那么這個的查找路徑又是怎樣的呢?
STM32 在 KEIL中使用的編譯器為 ARMCC,這個系統(tǒng)路徑的位置為:“KEIL的安裝目錄”:\\Keil_v5\\ARM\\ARMCC\\include
,比如博主的KEIL安裝在C盤,這個路徑就是C:\\Keil_v5\\ARM\\ARMCC\\include
。
這一點我就不去確定了,大家可以自己添加一個庫函數(shù)頭文件,然后自己根據(jù)上文的方式測試一下便知。
三、Linux 中的頭文件路徑
上面介紹了 Windows 下的 KEIL 環(huán)境中的頭文件系統(tǒng)路徑,那么我們來看看 Linux 中的路徑又是在哪里,我們知道在 Linux 中 C 語言的編譯器是 GCC 編譯器,在文章開頭的前言我就寫過了, 使用 GCC 編譯器可以很直觀的查看到 #include < >
尖括號包含的頭文件的查找路徑,下面我們來看一下。
寫一個簡單的程序,里面用到了
這個頭文件,我們可以使用編譯選項 -v
來打印出詳細的編譯步驟:
如上圖所示,在 Linux 是不是很直觀,沒什么需要特別說明的。
那么我們再換另外一種編譯器,其實還是 GCC ,只不過是 ARMGCC,我們也來看一看:
可以看到,同樣的可以很直觀的看到尖括號包含的頭文件的搜索位置,當然,因為編譯器的更換,他們搜索的位置也改變了。
最后簡單總結(jié)一下,使用 #include < >
所包含的頭文件,其查找路徑和使用的編譯器有關(guān),編譯器都會自帶常用的庫文件,在 GCC 環(huán)境下面,使用 -v
選項就會自動打印出查找位置,使用 IDE 環(huán)境根據(jù) IDE 使用的編譯器不同存放在對應(yīng)的目錄文件下面,一般來說都可以在 IDE 安裝目錄中可以找到。
結(jié)語
本文我們針對 C 語言頭文件路徑問題進行了講解,舉例說明了 Windows 下的 IDE 環(huán)境中 和 Linux 下GCC 環(huán)境中的C語言的 頭文件查找路徑。
文中還對引出的絕對路徑與相對路徑,還有路徑引用時候的 正斜杠 /
與 反斜杠 \\
與雙斜杠 進行了說明。
希望大家以后在遇到頭文件路徑問題的時候,能夠知道如何去查找問題,解決問題!
好了,本文就到這里,謝謝大家!
-
Linux
+關(guān)注
關(guān)注
87文章
11232瀏覽量
208949 -
編譯器
+關(guān)注
關(guān)注
1文章
1618瀏覽量
49057
發(fā)布評論請先 登錄
相關(guān)推薦
評論