欧美vvv,亚洲第一成人在线,亚洲成人欧美日韩在线观看,日本猛少妇猛色XXXXX猛叫

新聞資訊

    gcc頭文件指定及動(dòng)態(tài)鏈接的使用

    本文詳細(xì)介紹了linux下gcc頭文件指定方法,以及搜索路徑順序的問(wèn)題。另外,還總結(jié)了,gcc動(dòng)態(tài)鏈接的方法以及路徑指定,同樣也討論了搜索路徑的順序問(wèn)題。本文包含了很多的例子,具有很強(qiáng)的操作性,希望讀者自己去走一遍。

    一.# 與# “”

    # 直接到系統(tǒng)指定的某些目錄中去找某些頭文件。

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

    二.gcc指定頭文件的三種情況:

    1.會(huì)在默認(rèn)情況下指定到/usr/文件夾(更深層次的是一個(gè)相對(duì)路徑,gcc可執(zhí)行程序的路徑是/usr/bin/gcc,那么它在實(shí)際工作時(shí)指定頭文件頭徑是一種相對(duì)路徑方法,換算成絕對(duì)路徑就是加上/usr/,如# 就是包含/usr//stdio.h)

    2.GCC還使用了-I指定路徑的方式,即

    gcc-I頭文件所在文件夾(絕對(duì)路徑或相對(duì)路徑均可)源文件

    舉一個(gè)例子:

    設(shè)當(dāng)前路徑為/root/test,其結(jié)構(gòu)如下:

    .c

    /.h

    有兩種方法訪(fǎng)問(wèn)到.h。

    1. .c中# “/.h”然后gcc .c即可

    2. .c中# 或者# 然后gcc –I .c也可

    3.參數(shù):-使編譯器不再系統(tǒng)缺省的頭文件目錄里面找頭文件,一般和-I聯(lián)合使用,明確限定頭文件的位置。

    在編譯驅(qū)動(dòng)模塊時(shí),由于非凡的需求必須強(qiáng)制GCC不搜索系統(tǒng)默認(rèn)路徑,也就是不搜索/usr/要用參數(shù)-,還要自己用-I參數(shù)來(lái)指定內(nèi)核頭文件路徑,這個(gè)時(shí)候必須在中指定。

    頭文件搜索順序:

    1.由參數(shù)-I指定的路徑(指定路徑有多個(gè)路徑時(shí),按指定路徑的順序搜索)

    linux find查看指定時(shí)間的文件夾_linux 指定動(dòng)態(tài)連接庫(kù)_linux 指定動(dòng)態(tài)連接庫(kù)

    2.然后找gcc的環(huán)境變量, ,

    3.再找內(nèi)定目錄

    /usr/

    /usr/local/

    /usr/lib/gcc-lib/i386-linux/2.95.2/

    /usr/lib/gcc-lib/i386-linux/2.95.2/../../../..//g++-3

    /usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/

    庫(kù)文件,但是如果裝gcc的時(shí)候,是有給定的的話(huà)linux 指定動(dòng)態(tài)連接庫(kù),那么就是

    /usr/

    /

    /xxx-xxx-xxx-/

    /lib/gcc-lib/xxxx-xxx-xxx-/2.8.1/

    三.Linux指定動(dòng)態(tài)庫(kù)路徑

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

    1.在配置文件/etc/ld.so.conf中指定動(dòng)態(tài)庫(kù)搜索路徑。

    可以通過(guò)編輯配置文件/etc/ld.so.conf來(lái)指定動(dòng)態(tài)庫(kù)的搜索路徑,該文件中每行為一個(gè)動(dòng)態(tài)庫(kù)搜索路徑。每次編輯完該文件后,都必須運(yùn)行命令使修改后的配置生效。

    舉一個(gè)例子:

    所有源文件:

    源文件1: .c

    linux find查看指定時(shí)間的文件夾_linux 指定動(dòng)態(tài)連接庫(kù)_linux 指定動(dòng)態(tài)連接庫(kù)

    #

    void prt()

    {

    ("You found me!!!/n");

    }

    源文件2: main.c

    void prt();

    int main()

    {

    prt();

    0;

    }

    操作過(guò)程:

    我們通過(guò)以下命令用源程序.c來(lái)創(chuàng)建動(dòng)態(tài)庫(kù).so。

    # gcc –o .o -c .c

    # gcc - -fPIC -o ..o

    #

    或者直接一條指令:

    #gcc – –fPIC –o ..c

    linux 指定動(dòng)態(tài)連接庫(kù)_linux find查看指定時(shí)間的文件夾_linux 指定動(dòng)態(tài)連接庫(kù)

    #

    注意:

    -fPIC參數(shù)聲明鏈接庫(kù)的代碼段是可以共享的,

    -參數(shù)聲明編譯為共享庫(kù)。請(qǐng)注意這次我們編譯的共享庫(kù)的名字叫做

    .so,這也是Linux共享庫(kù)的一個(gè)命名的慣例了:后綴使用so,而名稱(chēng)使用格式。

    接著通過(guò)以下命令編譯main.c,生成目標(biāo)程序main.out。

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

    #

    請(qǐng)注意為什么是-?

    然后把庫(kù)文件移動(dòng)到目錄/root/lib中。

    # mkdir /root/lib

    # mv .so /root/lib/ .so

    #

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

    運(yùn)行程序main.out:

    # ./main.out

    ./main.out: error while : .so: open file: No such file or

    #

    出錯(cuò)了,系統(tǒng)未找到動(dòng)態(tài)庫(kù).so。找找原因,原來(lái)在編輯完配置文件/etc/ld.so.conf后,沒(méi)有運(yùn)行命令,所以剛才的修改還未生效。我們運(yùn)行后再試試。

    linux 指定動(dòng)態(tài)連接庫(kù)_linux 指定動(dòng)態(tài)連接庫(kù)_linux find查看指定時(shí)間的文件夾

    #

    # ./main.out

    You found me!!!

    #

    程序main.out運(yùn)行成功,并且打印出正確結(jié)果。

    2.通過(guò)環(huán)境變量指定動(dòng)態(tài)庫(kù)搜索路徑。

    通過(guò)設(shè)定環(huán)境變量也可以指定動(dòng)態(tài)庫(kù)搜索路徑。當(dāng)通過(guò)該環(huán)境變量指定多個(gè)動(dòng)態(tài)庫(kù)搜索路徑時(shí),路徑之間用冒號(hào)":"分隔。下面通過(guò)例2來(lái)說(shuō)明本方法。

    舉一個(gè)例子:

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

    # =/root

    #

    然后運(yùn)行:

    #./main.out

    You found me!!!

    #

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

    3.在編譯目標(biāo)代碼時(shí)指定該程序的動(dòng)態(tài)庫(kù)搜索路徑。

    還可以在編譯目標(biāo)代碼時(shí)指定程序的動(dòng)態(tài)庫(kù)搜索路徑。-Wl,表示后面的參數(shù)將傳給link程序ld(因?yàn)間cc可能會(huì)自動(dòng)調(diào)用ld)。這里通過(guò)gcc的參數(shù)"-Wl,-rpath,"指定

    舉一個(gè)例子:

    linux 指定動(dòng)態(tài)連接庫(kù)_linux 指定動(dòng)態(tài)連接庫(kù)_linux find查看指定時(shí)間的文件夾

    這次我們還把上面得到的文件.so移動(dòng)到另一個(gè)地方去,如/root/test/lib下面,

    因?yàn)槲覀冃枰诰幾g目標(biāo)代碼時(shí)指定可執(zhí)行文件的動(dòng)態(tài)庫(kù)搜索路徑,所以需要用gcc命令重新編譯源程序main.c(見(jiàn)程序2)來(lái)生成可執(zhí)行文件main.out。

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

    #

    運(yùn)行結(jié)果:

    # ./main.out

    You found me!!!

    #

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

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

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

    以上介紹了三種指定動(dòng)態(tài)庫(kù)搜索路徑的方法,加上默認(rèn)的動(dòng)態(tài)庫(kù)搜索路徑/lib和/usr/lib,共五種動(dòng)態(tài)庫(kù)的搜索路徑,那么它們搜索的先后順序是什么呢?讀者可以用下面的方法來(lái)試驗(yàn)一下:

    (1)用前面介紹的方法生成5個(gè).so放在5個(gè)不同的文件夾下面,要求每一個(gè).so都唯一對(duì)應(yīng)一個(gè)搜索路徑,并注意main.out程序輸出的不同。

    (2)運(yùn)行main.out,即可看出他是那個(gè)搜索路徑下的,然后刪除這個(gè)路徑下的.so,然后再運(yùn)行。依此類(lèi)推操作,即可推出搜索順序。

    可以得出動(dòng)態(tài)庫(kù)的搜索路徑搜索的先后順序是:

    1.編譯目標(biāo)代碼時(shí)指定的動(dòng)態(tài)庫(kù)搜索路徑;

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

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

    4.默認(rèn)的動(dòng)態(tài)庫(kù)搜索路徑/lib;

    5.默認(rèn)的動(dòng)態(tài)庫(kù)搜索路徑/usr/lib。

    在上述1、2、3指定動(dòng)態(tài)庫(kù)搜索路徑時(shí),都可指定多個(gè)動(dòng)態(tài)庫(kù)搜索路徑linux 指定動(dòng)態(tài)連接庫(kù),其搜索的先后順序是按指定路徑的先后順序搜索的。有興趣的讀者自己驗(yàn)證。

網(wǎng)站首頁(yè)   |    關(guān)于我們   |    公司新聞   |    產(chǎn)品方案   |    用戶(hù)案例   |    售后服務(wù)   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區(qū)    電話(huà):010-     郵箱:@126.com

備案號(hào):冀ICP備2024067069號(hào)-3 北京科技有限公司版權(quán)所有