1. 關于gcc搜索頭檔案和靜態庫的目錄,雖然可以在編譯時加引數修改,但是能永久修改嗎?讓以后不必再用引數指定目錄那種。
2. gcc是根據什么找到頭檔案對應的靜態庫檔案的?為什么即便在同一目錄下,有的庫gcc就能自動鏈接,有的則需要我們指定?
uj5u.com熱心網友回復:
頭檔案搜索頭檔案搜索順序:
1.由引數-I指定的路徑(指定路徑有多個路徑時,按指定路徑的順序搜索)
2.然后找gcc的環境變數 C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH
3.再找內定目錄
/usr/include
/usr/local/include
/usr/lib/gcc-lib/i386-linux/2.95.2/include
/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g++-3
/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include
如果你沒指定1,那就從2開始找,如果2也沒指定,就從3開始找,其中/usr/include是相對于gcc的,因為一般gcc安裝在/usr/bin/gcc,所以/usr/include就是默認搜索路徑
鏈接庫搜索路徑
1.編譯目標代碼時指定的動態庫搜索路徑;
2.環境變數LIBRARY_PATH(編譯時),LD_LIBRARY_PATH(運行時)指定的動態庫搜索路徑;
3.組態檔/etc/ld.so.conf中指定的動態庫搜索路徑;
4.默認的動態庫搜索路徑/lib;
5.默認的動態庫搜索路徑/usr/lib。
uj5u.com熱心網友回復:
使用makefile
uj5u.com熱心網友回復:
關鍵是這些路徑是寫在哪里的?總不可能是寫在gcc里面的吧?而且我的環境是mingw,不是linux。
我編譯的時候是指定gcc命令列編譯,沒有使用makefile,所以,對于那些能自動找到目標庫的,比如標準庫、win32庫,它怎么知道哪個對應哪個?
uj5u.com熱心網友回復:
你都沒仔細看吧?不是告訴你搜索路徑的順序了嗎,你不用makefile,就用環境變數好了呀
inlcude環境變數C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH
link環境變數LIBRARY_PATH(編譯時),LD_LIBRARY_PATH(運行時)
定義環境變數不會嗎?不會的話自己谷歌百度搜索怎么定義環境變數
https://blog.csdn.net/Flood_Dragon/article/details/12363705
uj5u.com熱心網友回復:
老哥。。。這。。。
我不是在問它的搜索路徑有哪些,要看搜索路徑我給gcc加個引數輸出來不就行了嗎?
你說的這些環境變數,包括你的這個鏈接,關鍵是,現在并沒有這些環境變數,它也一樣正常作業的,也依然能找到庫的位置,這是我所疑惑的,我是想知道,這個記錄該路徑的的字串在哪里?既然環境變數沒有,那么它在哪里?我搜索過整個mingw里的文本內容,沒有這些路徑,所以我在懷疑它是不是寫在gcc或ld程式里面的?
第二個,也是最重要的問題,gcc是根據什么找到對應的庫的,比如我包含math.h,或呼叫數學函式,gcc怎么知道需要的庫是哪一個?為什么有的庫,檔案夾里明明就有,它卻又找不到,需要我們自己用引數來鏈接?
uj5u.com熱心網友回復:
你還是沒仔細看,不在makefile,不在環境變數里,那就是上面說的第三種情況,在gcc的安裝路徑的相對路徑里uj5u.com熱心網友回復:
唉,算了老哥,你一直沒明白我在講什么。我還是找找相關書籍吧
uj5u.com熱心網友回復:
不是不明白你問什么,而是你沒理解我回答的內容gcc會自動搜索include和lib路徑,這是在gcc內部實作的,它會以上述說的123的順序搜索路徑。
1和2沒有,為什么會搜索3?怎么搜索3,這不是很簡單嗎?gcc先取到自己安裝的路徑,比如安裝在C:\\MinGW\bin,gcc找到這個路徑后用相對路徑的方式找include,即C:\\MinGW\include,從C:\\MinGW\bin到C:\\MinGW\include怎么用相對路徑查找會吧?C:\\MinGW\bin\.. 就能找到C:\\MinGW(父檔案夾),再父檔案夾\include,即C:\\MinGW\bin\..\include就能找到include路徑了。怎么找到gcc安裝路徑?一個程式找到自己的路徑難嗎?main函式有個argv[0]引數,bat的話可以通過%~dp0引數獲取。
所以,你只要知道gcc安裝在哪,你就知道它默認的搜索路徑,那么這些頭檔案都在這個include路徑下,gcc不就能找到了嗎?這還有什么不明白的?
uj5u.com熱心網友回復:
同樣的,鏈接庫也在gcc安裝路徑的相對路徑的lib里,如gcc安裝在C:\\MinGW\bin,lib就是C:\\MinGW\lib,怎么通過相對路徑找的,前面一貼有說名uj5u.com熱心網友回復:
寫成 makefile,cmakelist之類的不就完了uj5u.com熱心網友回復:
你可以簡單地理解為gcc搜索路徑程式代碼類似如下實作if(getOpt(“I”)!=NULL) {//1 查找-I引數
//如果有-I引數,則搜索-I引數的路徑
}
if(getEnv(“xxx”) !=NULL) {//2 查找環境變數
//如果有設定相應的環境變數,則搜索環境變數指定的路徑
}
if(getRelativePath(argv[0])!=NULL) {//3 查找gcc安裝路徑的include相對路徑
//如果找到相對路徑,則搜索相對路徑
}
這樣你應該能理解gcc是怎么能找到include路徑了吧?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/49235.html
標籤:C語言
上一篇:求用c#設計 幫幫孩子做道題
