gcc以及共享庫的加載

1.    預處理器頭文件包含:

    gcc默認搜索頭文件位置
       gcc -E prog.c -o prog.i
       cpp prog.c > prog.i

       默認搜索頭文件路徑:
       /usr/include
       /usr/local/include

       當使用#include 預處理指令時,
       後面的<>中填寫相對於默認搜索目錄的路徑.
       若是使用"", 則默認先搜索當前目錄, 而後
       再搜索系統目錄.

       -I選項用來指定除默認搜索目錄以外的頭文件
    搜索路徑.

2. 預處理器定義
    簡單定義:
    #define MACRO_NAME REPLACE

    定義"宏函數", 帶參宏:
    #define MACRO_FUNC(arg1, arg2) REPLACE

3. 條件編譯
    #ifdef DEBUG
        ...
    #else
        ...
    #endif

    #ifndef XXX
        ...
    #else
        ...
    #endif

    #if 1
        ...
    #else
        ...
    #endif

    注意條件編譯是在編譯期編譯以前處理的,
    所以它和C語言的if語句有本質的差異, 它
    不在運行時進行條件判斷.

    gcc選項 -D能夠用來預約義一個宏,
    ex:
        gcc -DDEBUG ...
    表明預約義DEBUG宏

4. 庫(用size命令查看可執行程序的大小)
    1) 靜態庫生成:
    靜態庫(static library, archive, 後綴.a): 
        打包好的.o檔.
        打包:
        ar -crv libxxx.a 1.o 2.o ...
    當應用程序使用靜態庫時,
    靜態庫和應用程序連接在一塊兒, 應用程序中會保存有
    靜態庫的副本.
    靜態庫的缺點:
        1. 佔用空間
        2. 升級不便, 每次升級都要從新連接程序.

    2). 共享庫生成
    共享庫(shared object, dynamic linked library,
    後綴.so):
        gcc --shared -fPIC -o libxxx.so 1.c 2.c ...
    當應用程序使用共享庫時,
    連接階段應用程序須要查詢函數是否認義, 但並不將
    共享庫的副本保存在應用程序中. 當應用程序開始執
    行時, 操做系統會經過保留在應用程序中的相關信息
    加載相應的共享庫.
    動態庫/共享庫的優勢:
        1. 佔用空間少(硬盤佔用少, 內存空間佔用少)
        2. 升級方便
    缺點:
        須要將其放入系統默認動態庫搜索目錄或者配置
        /etc/ld.so.conf才能使用, 軟件發佈具備依賴性.

5. gcc 選項:
    -I: 指定gcc除默認目錄外的頭文件搜索目錄.
    -L: 指定gcc除默認搜索目錄外的庫文件搜索目錄.
        gcc默認搜索/lib 和 /usr/lib下的庫文件.
    -l: 指定連接哪個庫. 例如, 要連接數學庫libm.so
        那麼編譯時命令行上指定 -lm

6. 共享庫加載
    系統默認到/lib /usr/lib下加載動態庫.
    不然須要配置 /etc/ld.so.conf, 加入放置動態庫的
    路徑, 並執行ldconfig更新動態庫路徑信息.
相關文章
相關標籤/搜索