新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Linux下C編程基礎之:gcc編譯器

        Linux下C編程基礎之:gcc編譯器

        作者: 時間:2013-09-13 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/257151.htm

        我們用unsgn_pow.c文件可以制作一個。下面分別講解怎么生成靜態庫和動態庫。

        n 靜態庫的創建和使用。

        創建靜態庫比較簡單,使用歸檔工具ar將一些目標文件集成在一起。

        [root@localhostlib]#gcc-cunsgn_pow.c

        [root@localhostlib]#arrcsvlibpow.aunsgn_pow.o

        a-unsgn_pow.o

        下面編譯主程序,它將會鏈接到剛生成的靜態庫libpow.a。具體運行結果如下所示。

        [root@localhostlib]#gcc-opow_testpow_test.c-L.–lpow

        [root@localhostlib]#./pow_test210

        2^10=1024

        其中,選項“-Ldir”的功能與“-Idir”類似,能夠在庫文件的搜索路徑列表中添加dir目錄,而“-lname”選項指示編譯時鏈接到庫文件libname.a或者libname.so。本實例中,程序pow_test.c需要使用當前目錄下的一個靜態庫libpow.a。

        n 動態庫的創建和使用。

        首先使用gcc的-fPIC選項為動態庫構造一個目標文件

        [root@localhostlib]#gcc-fPIC-Wall-cunsgn_pow.c

        接下來,使用-shared選項和已創建的位置無關目標代碼,生成一個動態庫libpow.so。

        [root@localhostlib]#gcc-shared-olibpow.sounsgn_pow.o

        下面編譯主程序,它將會鏈接到剛生成的動態庫libpow.so。

        [root@localhostlib]#gcc-opow_testpow_test.c-L.–lpow

        在運行可執行程序之前,需要注冊動態庫的路徑名。其方法有幾種:修改/etc/ld.so.conf文件,或者修改LD_LIBRARY_PATH環境變量,或者將庫文件直接復制到/lib或者/usr/lib目錄下(這兩個目錄為系統的默認的庫路徑名)。

        [root@localhostlib]#cplibpow.so/lib

        [root@localhostlib]#./pow_test210

        2^10=1024

        動態庫只有當使用它的程序執行時才被鏈接使用,而不是將需要的部分直接編譯入可執行文件中,并且一個動態庫可以被多個程序使用故可稱為共享庫,而靜態庫將會整合到程序中,因此在程序執行時不用加載靜態庫。從而可知,鏈接到靜態庫會使用戶的程序臃腫,并且難以升級,但是可能會比較容易部署。而鏈接到動態庫會使用戶的程序輕便,并且易于升級,但是會難以部署。

        (3)告警和出錯選項。

        gcc的告警和出錯選項如表3.9所示。

        表3.9 gcc警告和出錯選項選項列表

        選項

        含義

        -ansi

        支持符合ANSI標準的C程序

        -pedantic

        允許發出ANSIC標準所列的全部警告信息

        -pedantic-error

        允許發出ANSIC標準所列的全部錯誤信息

        -w

        關閉所有告警

        -Wall

        允許發出gcc提供的所有有用的報警信息

        -werror

        把所有的告警信息轉化為錯誤信息,并在告警發生時終止編譯過程

        下面結合實例對這幾個告警和出錯選項進行簡單的講解。

        有以下程序段:

        #includestdio.h>

        voidmain()

        {

        longlongtmp=1;

        printf(Thisisabadcode!n);

        return0;

        }

        這是一個很糟糕的程序,讀者可以考慮一下有哪些問題。

        n “-ansi”

        該選項強制gcc生成標準語法所要求的告警信息,盡管這還并不能保證所有沒有警告的程序都是符合ANSIC標準的。運行結果如下所示:

        [root@localhostgcc]#gcc–ansiwarning.c–owarning

        warning.c:在函數“main”中:

        warning.c:7警告:在無返回值的函數中,“return”帶返回值

        warning.c:4警告:“main”的返回類型不是“int”

        可以看出,該選項并沒有發現“longlong”這個無效數據類型的錯誤。

        n “-pedantic”

        打印ANSIC標準所列出的全部警告信息,同樣也保證所有沒有警告的程序都是符合ANSIC標準的。其運行結果如下所示:

        [root@localhostgcc]#gcc–pedanticwarning.c–owarning

        warning.c:在函數“main”中:

        warning.c:5警告:ISOC90不支持“longlong”

        warning.c:7警告:在無返回值的函數中,“return”帶返回值

        warning.c:4警告:“main”的返回類型不是“int”

        可以看出,使用該選項查出了“longlong”這個無效數據類型的錯誤。

        n “-Wall”

        打印gcc能夠提供的所有有用的報警信息。該選項的運行結果如下所示:

        [root@localhostgcc]#gcc–Wallwarning.c–owarning

        warning.c:4警告:“main”的返回類型不是“int”

        warning.c:在函數“main”中:

        warning.c:7警告:在無返回值的函數中,“return”帶返回值

        warning.c:5警告:未使用的變量“tmp”

        使用“-Wall”選項找出了未使用的變量tmp,但它并沒有找出無效數據類型的錯誤。

        另外,gcc還可以利用選項對單獨的常見錯誤分別指定警告。

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        linux相關文章:linux教程


        c++相關文章:c++教程




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 鲁山县| 潮安县| 吉木乃县| 云浮市| 琼中| 临澧县| 阳城县| 孟州市| 雷山县| 宾川县| 中卫市| 朔州市| 大丰市| 湘潭县| 芜湖市| 东丰县| 巴马| 交口县| 宁化县| 磐石市| 五台县| 金平| 舟曲县| 安陆市| 宿松县| 文水县| 从化市| 科技| 巴楚县| 赣榆县| 和田市| 呼玛县| 丰宁| 方正县| 云阳县| 富源县| 前郭尔| 明星| 赤峰市| 黄山市| 嘉善县|