gcc編譯搜索路徑
1. 如何指定gcc的默認頭文件路徑
gcc指定頭文件路徑及動態鏈接庫路徑
本文詳細介紹了linux 下gcc頭文件指定方法,以及搜索路徑順序的問題。另外,還總結了,gcc動態鏈接的方法以及路徑指定,同樣也討論了搜索路徑的順序問題。本文包含了很多的例子,具有很強的操作性,希望讀者自己去走一遍。
一.#include <>與#include 「」
#include <>直接到系統指定的某些目錄中去找某些頭文件。
#include 「」先到源文件所在文件夾去找,然後再到系統指定的某些目錄中去找某些頭文件。
二.gcc指定頭文件的三種情況:
1.會在默認情況下指定到/usr/include文件夾(更深層次的是一個相對路徑,gcc可執行程序的路徑是/usr/bin/gcc,那麼它在實際工作時指定頭文件頭徑是一種相對路徑方法,換算成絕對路徑就是加上/usr/include,如#include 就是包含/usr/include/stdio.h)
2.GCC還使用了-I指定路徑的方式,即
gcc -I 頭文件所在文件夾(絕對路徑或相對路徑均可) 源文件
舉一個例子:
設當前路徑為/root/test,其結構如下:
include_test.c
include/include_test.h
有兩種方法訪問到include_test.h。
1. include_test.c中#include 「include/include_test.h」然後gcc include_test.c即可
2. include_test.c中#include 或者#include 然後gcc –I include include_test.c也可
3. 參數:-nostdinc使編譯器不再系統預設的頭文件目錄裡面找頭文件,一般和-I聯合使用,明確限定頭文件的位置。
在編譯驅動模塊時,由於非凡的需求必須強制GCC不搜索系統默認路徑,也就是不搜索/usr/include要用參數-nostdinc,還要自己用-I參數來指定內核頭文件路徑,這個時候必須在Makefile中指定。
頭文件搜索順序:
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
庫文件,但是如果裝gcc的時候,是有給定的prefix的話,那麼就是
/usr/include
prefix/include
prefix/xxx-xxx-xxx-gnulibc/include
prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include
三.Linux指定動態庫路徑
眾所周知,Linux動態庫的默認搜索路徑是/lib和/usr/lib。動態庫被創建後,一般都復制到這兩個目錄中。當程序執行時需要某動態庫, 並且該動態庫還未載入到內存中,則系統會自動到這兩個默認搜索路徑中去查找相應的動態庫文件,然後載入該文件到內存中,這樣程序就可以使用該動態庫中的函 數,以及該動態庫的其它資源了。在Linux 中,動態庫的搜索路徑除了默認的搜索路徑外,還可以通過以下三種方法來指定。
1.在配置文件/etc/ld.so.conf中指定動態庫搜索路徑。
可以通過編輯配置文件/etc/ld.so.conf來指定動態庫的搜索路徑,該文件中每行為一個動態庫搜索路徑。每次編輯完該文件後,都必須運行命令ldconfig使修改後的配置生效。
舉一個例子:
所有源文件:
源文件1: lib_test.c
#include
void prt()
{
printf(「You found me!!!/n」);
}
源文件2: main.c
void prt();
int main()
{
prt();
return 0;
}
2. ubuntu下怎樣找gcc編譯器路徑
這個在終端輸入 which gcc 就行了
不過一般是/usr/bin/gcc
3. linux編譯的c++程序位置
linux系統編神差孫譯C++程序時頭⽂件和庫⽂件搜索路徑
C++編譯時,教科書中寫道:#include 「headfile.h」優先在當前⽬錄查找頭⽂件;#include < headfile.h>從系統默認路徑查找頭⽂件。先
前以為系統默認路徑是環境變數$PATH指定的路徑,在系統上⼀查,傻了眼:
-bash-3.2$ echo$PATH
/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/X11R6/bin:/usr/java/j2re1.4.0/bin:/usr/atria/bin:/ccase/bin:/home/devcomp
全是bin⽬錄,$PATH是運⾏可執⾏⽂件時的搜索路徑,與include頭⽂件的搜索路徑⽆關,可能不少⼈犯了我這樣的錯誤。
頭⽂件:
1. #include「headfile.h」
搜索順序為:
①先搜索當前⽬錄
②然後搜索-I指定的⽬錄
③再搜索gcc的環境變數CPLUS_INCLUDE_PATH(C程序使⽤的是C_INCLUDE_PATH)
④最後搜索gcc的內定⽬錄
/usr/include
/usr/local/include
/usr/lib/gcc/x86_64-redhat-linux/4.1.1/include
各⽬錄存在相同⽂件時,先找到哪個使⽤哪個。
2. #include<headfile.h>
①先搜索-I指定的⽬錄
②然後搜索gcc的環境變數CPLUS_INCLUDE_PATH
③最後搜索gcc的內定⽬錄
/usr/include
/usr/local/include
/usr/lib/gcc/x86_64-redhat-linux/4.1.1/include
與上⾯的相同,各⽬錄存在相同⽂件時,先找到哪個使⽤哪游鏈個。這⾥要注意,#include<>⽅式不會搜索當前⽬錄!
這⾥要說下include的內定⽬錄,它不是由$PATH環境變數指定的,⽽是由g++的配置prefix指定的(知道它在安裝g++時可以指定,不知安
裝後如何修改的,可能是修改配置⽂件,需要時再研究下):
-bash-3.2$ g++ -v
Using built-inspecs.
Target:x86_64-redhat-linux
Configured with:../configure --prefix=/usr --mandir=/usr/share/man--infodir=/usr/share/info --enable-shared --enable-threads=posix--enable-checking=release --with-system-zlib --enable-__cxa_atexit--disable-libunwind-exceptions --enable-libgcj-multifile--enable-languages=c,c++,objc,obj-c++,java,fortran,ada--enable-java-awt=gtk --disable-dssi --enable-plugin--with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre--with-cpu=generic --host=x86_64-redhat-linux
Thread model:posix
gcc version 4.1.2 20080704(Red Hat 4.1.2-46)
在安裝g++時,指定了prefix,那麼內定搜索⽬錄就是:
Prefix/include
Prefix/local/include
Prefix/lib/gcc/--host/--version/include
編譯時可以通過-nostdinc++選項屏蔽對內定⽬錄搜索頭⽂件。
庫⽂件:
編譯的時候:
①gcc會去找-L
②再找gcc的環境變數LIBRARY_PATH
③再找內定⽬錄/lib /usr/lib/usr/local/lib 這是當初compilegcc時寫在程序內的(不可配置的?)
運⾏時動態庫的搜索路徑:
動態庫的搜索路徑搜索的先後順序是:
①編譯⽬標代碼時指定的動態庫搜索路徑(慶跡這是通過gcc 的參數"-Wl,-rpath,"指定。當指定多個動態庫搜索路徑時,路徑之間⽤冒號":"分隔)
②環境變數LD_LIBRARY_PATH指定的動態庫搜索路徑(當通過該環境變數指定多個動態庫搜索路徑時,路徑之間⽤冒號":"分隔)
③配置⽂件/etc/ld.so.conf中指定的動態庫搜索路徑;
④默認的動態庫搜索路徑/lib;
⑤默認的動態庫搜索路徑/usr/lib。
(應注意動態庫搜尋路徑並不包括當前⽂件夾,所以當即使可執⾏⽂件和其所需的so⽂件在同⼀⽂件夾,也會出現找不到so的問題,類同#include<header_file>不搜索當前⽬錄)
¥
5
網路文庫VIP限時優惠現在開通,立享6億+VIP內容
立即獲取
linux系統編譯C++程序時頭文件和庫文件搜索路徑
linux系統編譯C++程序時頭⽂件和庫⽂件搜索路徑
C++編譯時,教科書中寫道:#include 「headfile.h」優先在當前⽬錄查找頭⽂件;#include < headfile.h>從系統默認路徑查找頭⽂件。先
前以為系統默認路徑是環境變數$PATH指定的路徑,在系統上⼀查,傻了眼:
-bash-3.2$ echo$PATH
/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/X11R6/bin:/usr/java/j2re1.4.0/bin:/usr/atria/bin:/ccase/bin:/home/devcomp
第 1 頁
全是bin⽬錄,$PATH是運⾏可執⾏⽂件時的搜索路徑,與include頭⽂件的搜索路徑⽆關,可能不少⼈犯了我這樣的錯誤。
頭⽂件:
1. #include「headfile.h」
搜索順序為:
①先搜索當前⽬錄
②然後搜索-I指定的⽬錄
③再搜索gcc的環境變數CPLUS_INCLUDE_PATH(C程序使⽤的是C_INCLUDE_PATH)
展開全文
限免
導長圖
轉存到網盤
發送至微信
下載文檔
北京網路網訊科技有限公司 版本號8.0.70
4. linux下編寫c++,include的那些頭文件在什麼地方
C/C++程序在linux下被編譯和連接時,GCC/G++會查找系統默認的include和link的路徑,以及自己在編譯命令中指定的路徑。
1、#include <stdio.h>,直接到系統指定目錄去查找頭文件。
系統默認路徑為:/usr/include,/usr/local/include,/usr/lib/gcc-lib/i386-Linux/2.95.2/include(gcc庫文件的路徑,各個系統不一致)
2、#include "stidio.h",會先到當前目錄查找頭文件,如果沒找到在到系統指定目錄查找。
3、gcc編譯時查找頭文件,按照以下路徑順序查找:
gcc編譯時,可以設置-I選項以指定頭文件的搜索路徑,如果指定多個路徑,則按照順序依次查找。比如,gcc -I /usr/local/include/node a.c
gcc會查找環境變數C_INCLUDE_PATH,CPLUS_INCLUDE_PATH中指定的路徑。
(4)gcc編譯搜索路徑擴展閱讀:
應用程序代碼編譯過程:
編譯器根據頭文件提供的庫函數介面形式,來編譯代碼,然後生成目標文件;然後,再使用鏈接器將這個目標文件與系統庫鏈接;最終生成應用程序。代碼包含了自己寫的內容,還有系統提供好的現成的庫函數,整個結合起來才形成一個完整的程序。
庫函數的頭文件,在編譯的時候被使用,而庫函數的代碼段(庫文件),在鏈接的時候被使用。
example:
應用程序代碼在使用一個系統調用的時候,例如printf()函數,需要指定包含的頭文件stdio.h;另外,在鏈接的時候對應的鏈接libc.a(筆者電腦文件所在目錄:/usr/lib/i386-linux-gnu/libc.a)。
總結一下,編寫應用程序,需要使用linux系統提供的庫函數。具體實現起來,需要頭文件和庫文件。頭文件是需要我們編寫應用程序的時候,在源文件開頭添加的;而庫文件則需要配置編譯環境進行指定搜索目錄。
5. gcc編譯程序時的命令行參數-I(大寫i) -L -l (小寫L) 2020-10-10
我們用gcc編譯程序時,可能會用到「-I」(大寫i),「-L」(大寫l),「-l」(小寫l)等參數,下面做個記錄:
例:
gcc -Wall -I /home/hello/include -L /home/hello/lib main.c -l world -Wl,-rpath,/you/dir/name -o prog
上面這句表示在編譯hello.c時:
-I(大寫i) /home/hello/include表示將/home/hello/include目錄作為第一個尋找頭文件的目錄,尋找的順序是:/home/hello/include-->/usr/include-->/usr/local/include
-L /home/hello/lib表示將/home/hello/lib目錄作為第一個尋找庫文件的目錄,尋找的順序是:/home/hello/lib-->/lib-->/usr/lib-->/usr/local/lib
-l(小寫的L)world表示在上面的lib的路徑中尋找libworld.so動態庫文件(如果gcc編譯選項中加入了「-static」表示尋找libworld.a靜態庫文件)
-rpath=dir
把目錄添加到運行時類庫搜索路徑
-Wl,option
把選項傳遞給Linker.如果選項值包含逗號,就把他拆分成多個選項
-Wl,-rpath,/opt/lib
解決 error while loading shared libraries: ****.so: cannot open shared object file: No such file or directory