gcc如何指定編譯頭文件的位置

#include <>#include “”
#include <>直接到系統(tǒng)指定的某些目錄中去找某些頭文件。
#include “”先到源文件所在文件夾去找,然后再到系統(tǒng)指定的某些目錄中去找某些頭文件。

gcc指定頭文件的三種情況

  1. 會在默認情況下指定到/usr/include文件夾(更深層次的是一個相對路徑,gcc可執(zhí)行程序的路徑是/usr/bin/gcc,它在實際工作時指定頭文件頭徑是一種相對路徑方法,換算成絕對路徑就是加上/usr/include,如#include<stdio.h> 就是/usr/include/stdio.h)。
  2. GCC還使用了-I指定路徑的方式,即gcc -I 頭文件,所在文件夾(絕對路徑或相對路徑均可) 源文件舉一個例子,如下代碼結(jié)構(gòu):
test.c
include/test.h

有兩種方法訪問到test.h。
(1) test.c中#include “include/test.h”然后gcc test.c即可
(2) test.c中g(shù)cc –I include test.c也可

  1. 參數(shù):-nostdinc使編譯器不再系統(tǒng)缺省的頭文件目錄里面找頭文件,一般和-I聯(lián)合使用,明確限定頭文件的位置。
    在編譯驅(qū)動模塊時,由于非凡的需求必須強制GCC不搜索系統(tǒng)默認路徑,也就是不搜索/usr/include要用參數(shù)-nostdinc,還要自己用-I參數(shù)來指定內(nèi)核頭文件路徑,這個時候必須在Makefile中指定。頭文件搜索順序:
    (1) 由參數(shù)-I指定的路徑(指定路徑有多個路徑時,按指定路徑的順序搜索)
    (2) 然后找gcc的環(huán)境變量C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH
    (3) 再找內(nèi)定目錄`
/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指定動態(tài)庫路徑

眾所周知,Linux動態(tài)庫的默認搜索路徑是/lib/usr/lib。動態(tài)庫被創(chuàng)建后,一般都復(fù)制到這兩個目錄中。當程序執(zhí)行時需要某動態(tài)庫, 并且該動態(tài)庫還未加載到內(nèi)存中,則系統(tǒng)會自動到這兩個默認搜索路徑中去查找相應(yīng)的動態(tài)庫文件,然后加載該文件到內(nèi)存中,這樣程序就可以使用該動態(tài)庫中的函 數(shù),以及該動態(tài)庫的其它資源了。在Linux中,動態(tài)庫的搜索路徑除了默認的搜索路徑外,還可以通過以下三種方法來指定。

1.在配置文件/etc/ld.so.conf中指定動態(tài)庫搜索路徑
可以通過編輯配置文件/etc/ld.so.conf來指定動態(tài)庫的搜索路徑,該文件中每行為一個動態(tài)庫搜索路徑。每次編輯完該文件后,都必須運行命令ldconfig使修改后的配置生效。
[ lib_test.c]

#include <stdio.h>
void prt() {
    printf("You found me!!!/n");
}

[ main.c]

void prt();
int main() {
    prt();
    return 0;
}

我們通過以下命令用源程序lib_test.c來創(chuàng)建動態(tài)庫 lib_test.so。

gcc -shared -fpic -o lib_test.so lib_test.c
  • -fPIC參數(shù)聲明鏈接庫的代碼段是可以共享的,
  • -shared參數(shù)聲明編譯為共享庫。請注意這次我們編譯的共享庫的名字叫做lib_test.so,這也是Linux共享庫的一個命名的慣例了:后綴使用so,而名稱使用libxxxx格式。

接著通過以下命令編譯main.c,生成目標程序main.out。

gcc -o main.out -L. –l_test main.c

當要用到一個第三方提供的庫名字lib_test.so,那么我們只要把lib_test.so拷貝到/usr/lib里,編譯時加上-l_test參數(shù),就能用上lib_test.so庫了(當然要用lib_test.so庫里的函數(shù),我們還需要與lib_test.so配套的頭文件)。

然后把庫文件移動到目錄/root/lib中。

mkdir /root/lib
mv lib_test.so /root/lib/ lib_test.so

最后編輯配置文件/etc/ld.so.conf,在該文件中追加一行/root/lib。運行程序main.out:

# ./main.out
./main.out: error while loading shared libraries: lib_test.so: cannot open shared object file: No such file or directory
#

出錯了,系統(tǒng)未找到動態(tài)庫lib_test.so。找找原因,原來在編輯完配置文件/etc/ld.so.conf后,沒有運行命令ldconfig,所以剛才的修改還未生效。我們運行l(wèi)dconfig后再試試。

# ldconfig
# ./main.out
You found me!!!

2.通過環(huán)境變量LD_LIBRARY_PATH指定動態(tài)庫搜索路徑
通過設(shè)定環(huán)境變量LD_LIBRARY_PATH也可以指定動態(tài)庫搜索路徑。當通過該環(huán)境變量指定多個動態(tài)庫搜索路徑時,路徑之間用冒號”:”分隔。

這次我們把上面得到的文件lib_test.so移動到另一個地方去,如/root下面,然后設(shè)置環(huán)境變量LD_LIBRARY_PATH找到lib_test.so。設(shè)置環(huán)境變量方法如下:

# export LD_LIBRARY_PATH=/root

然后運行:

#./main.out
You found me!!!

注意:設(shè)置環(huán)境變量LD_LIBRARY_PATH=/root是不行的,非得export才行。

3.在編譯目標代碼時指定該程序的動態(tài)庫搜索路徑
還可以在編譯目標代碼時指定程序的動態(tài)庫搜索路徑。-Wl,表示后面的參數(shù)將傳給link程序ld(因為gcc可能會自動調(diào)用ld)。這里通過gcc 的參數(shù)-Wl, -rpath,指定

舉一個例子:
這次我們還把上面得到的文件lib_test.so移動到另一個地方去,如/root/test/lib下面,因為我們需要在編譯目標代碼時指定可執(zhí)行文件的動態(tài)庫搜索路徑,所以需要用gcc命令重新編譯源程序main.c來生成可執(zhí)行文件main.out。

# gcc -o main.out -L. –l_test -Wl,-rpath, /root/test/lib  main.c

運行結(jié)果:

# ./main.out
You found me!!!

程序./main.out運行成功,輸出的結(jié)果正是main.c中的函數(shù)prt的運行結(jié)果。因此程序main.out搜索到的動態(tài)庫是/root/test/lib/lib_test.so。

關(guān)于-Wl,rpath的使用方法我再舉一個例子,應(yīng)該不難從中看出指定多個路徑的方法:

gcc -Wl,-rpath,/home/arc/test, -rpath,/lib/, -rpath,/usr/lib/, -rpath,/usr/local/lib test.c

動態(tài)庫的搜索路徑搜索的先后順序是:

1.編譯目標代碼時指定的動態(tài)庫搜索路徑;

2.環(huán)境變量LD_LIBRARY_PATH指定的動態(tài)庫搜索路徑;

3.配置文件/etc/ld.so.conf中指定的動態(tài)庫搜索路徑;

4.默認的動態(tài)庫搜索路徑/lib;

5.默認的動態(tài)庫搜索路徑/usr/lib。

在上述1、2、3指定動態(tài)庫搜索路徑時,都可指定多個動態(tài)庫搜索路徑,其搜索的先后順序是按指定路徑的先后順序搜索的。有興趣的讀者自己驗證。

參考:http://blog.csdn.net/mybelief321/article/details/9099659

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 動態(tài)鏈接,在可執(zhí)行文件裝載時或運行時,由操作系統(tǒng)的裝載程序加載庫。大多數(shù)操作系統(tǒng)將解析外部引用(比如庫)作為加載過...
    小5筒閱讀 5,778評論 0 3
  • 1.簡介 GCC 的意思也只是 GNU C Compiler 而已。經(jīng)過了這么多年的發(fā)展,GCC 已經(jīng)不僅僅能支持...
    Leon_Geo閱讀 770評論 0 4
  • (一) gcc的基本用法 (二) 警告提示功能選項 (三) 庫操作選項 (四) 調(diào)試選項 (五) 交叉編譯選項 (...
    何景根閱讀 2,857評論 0 1
  • 1. 先安裝Dev-c++,在安裝目錄找到“Dev-Cpp(安裝目錄)\bin\gcc”,就是它了。 2. 將“D...
    HuJay閱讀 1,446評論 1 2
  • 本手冊頁內(nèi)容摘自 GNU C 編譯器的完整文檔,僅限于解釋選項的含義.如果發(fā)現(xiàn)手冊頁和Info 文件之間有所矛盾,...
    極客圈閱讀 2,134評論 0 5

友情鏈接更多精彩內(nèi)容