GNU 編譯工具——gcc

GNU 編譯工具 —— gccc++

1、語法

    gcc  [選項參數] c文件函數

2、選項參數

    一、指定輸出文件名

        -o 指定輸出文件 工具

gcc -o main ch01.c

    二、警告與提示
優化

         -pedantic   檢測不符合ANSI/ISO C語言標準的源代碼,使用擴展語法的地方將產生警告信息spa

        -Wall 生成儘量多的警告信息。調試

        -Werror   要求編譯器將警告當作錯誤進行處理。code

    三、指定編譯文件類型

        -x   指定編譯代碼類型,c、c++、assembler,none。None根據擴展名自動確認。 對象

gcc –x c -Wall –o main ch01.c

    四、生成調試信息與優化

        -g   生成調試信息字符串

        -O   優化編譯器

    五、建議:在編譯任何程序的時候都帶上-Wall選項

3、文件後綴名

    .a   靜態對象庫

    .c   須要預處理的C語言源代碼

    .h   C語言源代碼頭文件

    .i   不須要預處理的C語言源代碼

    .o   目標文件

    .s   彙編語言代碼

    .so   共享對象庫

4、編譯過程

    a.預處理。

        一、語法:gcc -E C源代碼文件

        二、注意:

            預處理每次只能處理一個文件。不能處理多個文件,就是每一個.c文件對應一個.i文件。

            不指定 –o 選項,預處理的結果輸出到標準輸出設備。

        三、預編譯指令

                #define              定義宏

                #elif                   else if 多選分支

                #else                  與#if、#ifndef、#ifdef結合使用

                #error                產生錯誤、掛起與處理程序

                #if                      斷定

                #endif                結束斷定

                #ifdef                 斷定宏是否認義

                #ifndef               斷定宏是否認義

                #include             將指定的文件插入#include的位置

                #include_next     與#include同樣,但從當前目錄以後的目錄查找

                #line                   指定行號

                #pragma            提供額外信息的標準方法,可用來指定平臺

                #undef               刪除宏

                #warning            建立一個警告

                ##                      鏈接操做符號,用於宏內鏈接兩個字符串

    b.編譯

        編譯環境變量:

        C_INCLUDE_PATH:   查找頭文件的目錄——C。

        CPATH:  查找頭文件,至關於-l選項。

        CPLUS_INCLUDE_PATH:  查找頭文件的目錄——C++。

        LD_LIBRARY_PATH:  編譯沒有影響,主要影響運行。指定目錄便於定位共享庫。

        LIBRARY_PATH:  查找鏈接文件,至關於-l選項

    c.彙編

        一、編譯成彙編

gcc -S  ch01.c ch01_1.c

        二、編譯彙編

gcc ch01.s ch01_1.s -o main

    d.連接

5、建立靜態庫

    A、建立靜態庫

        a、編譯靜態庫

gcc -c -static ch01_1.c

            說明:

                其中-static可選,可阻止gcc使用共享庫,不使用共享庫會使可執行文件變大,但會減小運行時間開銷

        b、生成靜態庫

ar -r libmy.a  ch01_1.o

        c、使用靜態庫

gcc -o main ch01.c libmy.a

            若是libmy.a在LIBRARY_PATH的指定目錄中,還能夠採用以下方式編譯。

gcc  ch01.c  -o main –lmy

    B、建立共享庫

        a、編譯共享庫

            一、編譯成位置獨立代碼的目標文件,選項-fpic

gcc -c -fpic ch01_1.c

            二、編譯成共享庫,選項-shared

gcc -shared ch01_1.o -o libmy.so

            三、使用一條指令

gcc -fpic -shared  ch01_1.c -o libmy.so

        b、定位共享庫

            一、共享庫編譯的時候與靜態庫同樣依賴LIBRARAY_PATH,運行的時候依賴LD_LIBRARY_PATH。

            二、規則:

                    查找LD_LIBRARY_PATH,目錄使用冒號分隔。

                    /ect/ld.so.cache中找到的列表。工具ldconfig維護。

                    目錄/lib

                    目錄/usr/lib

        c、使用共享庫

gcc ch01.c libmy.so -o main

        d、共享庫的四個函數

            頭文件:#include <dlfcn.h>

void *dlopen(const char *filename, int flag);

char *dlerror(void);

void *dlsym(void *handle, const char *symbol);

int dlclose(void *handle);

        其中dlopen的參數flag的含義以下:

            RTLD_LAZY:符號查找時候才加載。

            RTLD_NOW:立刻加載。

相關文章
相關標籤/搜索