<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    gcc指定頭文件路徑及動態鏈接庫路徑

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    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;
    }
    操作過程:
    我們通過以下命令用源程序lib_test.c來創建動態庫 lib_test.so。
    # gcc –o lib_test.o -c lib_test.c
    # gcc -shared -fPIC -o lib_test.so lib_test.o
    #
    或者直接一條指令:
    #gcc –shared –fPIC –o lib_test.so lib_test.c
    #

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

    接著通過以下命令編譯main.c,生成目標程序main.out。
    # gcc -o main.out -L. –l_test main.c
    #

    請注意為什么是-l_test?

    然后把庫文件移動到目錄/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
    #
    出錯了,系統未找到動態庫lib_test.so。找找原因,原來在編輯完配置文件/etc/ld.so.conf后,沒有運行命令ldconfig,所以剛才的修改還未生效。我們運行ldconfig后再試試。

    # ldconfig
    # ./main.out
    You found me!!!
    #
    程序main.out運行成功,并且打印出正確結果。

    2.通過環境變量LD_LIBRARY_PATH指定動態庫搜索路徑。
    通過設定環境變量LD_LIBRARY_PATH也可以指定動態庫搜索路徑。當通過該環境變量指定多個動態庫搜索路徑時,路徑之間用冒號”:”分隔。下面通過例2來說明本方法。

    舉一個例子:
    這次我們把上面得到的文件lib_test.so移動到另一個地方去,如/root下面,然后設置環境變量LD_LIBRARY_PATH找到lib_test.so。設置環境變量方法如下:
    # export LD_LIBRARY_PATH=/root
    #
    然后運行:
    #./main.out
    You found me!!!
    #
    注意:設置環境變量LD_LIBRARY_PATH=/root是不行的,非得export才行。

    3.在編譯目標代碼時指定該程序的動態庫搜索路徑。
    還可以在編譯目標代碼時指定程序的動態庫搜索路徑。-Wl,表示后面的參數將傳給link程序ld(因為gcc可能會自動調用ld)。這里通過gcc 的參數”-Wl,-rpath,”指定
    舉一個例子:
    這次我們還把上面得到的文件lib_test.so移動到另一個地方去,如/root/test/lib下面,
    因為我們需要在編譯目標代碼時指定可執行文件的動態庫搜索路徑,所以需要用gcc命令重新編譯源程序main.c(見程序2)來生成可執行文件main.out。
    # gcc -o main.out -L. –l_test -Wl,-rpath,/root/test/lib main.c
    #

    運行結果:
    # ./main.out
    You found me!!!
    #

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

    關于-Wl,rpath的使用方法我再舉一個例子,應該不難從中看出指定多個路徑的方法:
    gcc -Wl,-rpath,/home/arc/test,-rpath,/lib/,-rpath,/usr/lib/,-rpath,/usr/local/lib test.c

    以上介紹了三種指定動態庫搜索路徑的方法,加上默認的動態庫搜索路徑/lib和/usr/lib,共五種動態庫的搜索路徑,那么它們搜索的先后順序是什么呢?讀者可以用下面的方法來試驗一下:
    (1) 用前面介紹的方法生成5個lib_test.so放在5個不同的文件夾下面,要求每一個lib_test.so都唯一對應一個搜索路徑,并注意main.out程序輸出的不同。
    (2) 運行main.out,即可看出他是那個搜索路徑下的,然后刪除這個路徑下的lib_test.so,然后再運行。依此類推操作,即可推出搜索順序。

    可以得出動態庫的搜索路徑搜索的先后順序是:

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

    2.環境變量LD_LIBRARY_PATH指定的動態庫搜索路徑;

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

    4.默認的動態庫搜索路徑/lib;

    5.默認的動態庫搜索路徑/usr/lib。

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

    PS:此文網上搜得,原始出處已經無法訪問,故無法給出原文鏈接。

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全