新聞中心

        gcc的幾個妙用

        作者: 時間:2016-12-01 來源:網(wǎng)絡(luò) 收藏
        下面的代碼如下:
        1. foo.c

        2. 1 #include
        3. 2
        4. 3
        5. 4 extern void bar();
        6. 5
        7. 6 void foo()
        8. 7{
        9. 8 printf("This is foo ().");
        10. 9
        11. 10 bar();
        12. 11}

        bar.c

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

        1 #include
        2
        3 void bar()
        4 {
        5 printf( " This is bar (). ");
        6 }
        7

        main.c

        1 extern void foo();
        2
        3 int main()
        4 {
        5 foo();
        6
        7 return 0;
        8 }
        ~

        簡要的介紹一些靜態(tài)庫的創(chuàng)建方式。
        首先需要注意的時靜態(tài)編譯是指將一些庫函數(shù)編譯到程序中,這樣會增加程序的大小。動態(tài)庫則是在運行過程中添加到程序中,這樣可以減小程序的大小。兩種方式都有各自的優(yōu)勢。
        靜態(tài)庫的創(chuàng)建:
        gcc -c foo.c -o foo.o
        gcc -c bar.c -o bar.o
        創(chuàng)建的基本過程就是采用歸檔函數(shù)實現(xiàn)。
        ar csr libfoo.a foo.o
        ar csr libbar.a bar.o
        從上面的程序我們可以知道foo程序依賴bar程序,而main程序則依賴foo程序,所以這樣就形成了一定的關(guān)系,一般來說只有將依賴的庫函數(shù)寫在最右邊才能保證其他的庫函數(shù)依賴該庫函數(shù)。
        [gong@Gong-Computer test]$ gcc -o main main.c -L. -lbar -lfoo
        ./libfoo.a(foo.o): In function `foo:
        foo.c:(.text+0x13): undefined reference to `bar
        collect2: ld returned 1 exit status
        [gong@Gong-Computer test]$ gcc -o main main.c -L. -lfoo -lbar
        以上的兩個編譯過程只是存在一個差異就是庫的擺放順序存在差別,第一種情況下由于foo依賴bar,而bar庫不能被foo調(diào)用,因此出錯。而第二種則滿足foo依賴bar,main依賴foo的關(guān)系。其中的-L.表示庫函數(shù)的搜索目錄為當(dāng)前目錄。也可以換成其他的目錄。
        因此在gcc中添加庫時,需要注意庫名和庫的順序,最好采用一定的依賴關(guān)系圖分析實現(xiàn)。具體的就要我們在設(shè)計程序時自己的考慮各個庫函數(shù)之間的關(guān)系。
        至于動態(tài)庫的創(chuàng)建可以采用gcc實現(xiàn)。其中的-shared就是表明了該庫是動態(tài)庫,-fPCI是指支持PCI,file.o是指需要加載到庫中的二進制文件。庫名就是libname.so
        gcc -shared -fPCI -o libname.so file.o
        動態(tài)庫的使用可以將創(chuàng)建好的動態(tài)庫放在/usr/lib下,然后在函數(shù)中即可實現(xiàn)調(diào)用。
        gcc的其他一些用法:
        查找系統(tǒng)文件路徑:gcc -v main.c
        獲得程序的依賴關(guān)系:gcc -M main.c ,其中包括了所有的依賴關(guān)系,在寫makefile過程中寫依賴關(guān)系通常不需要系統(tǒng)頭文件,這時可以采用gcc -MM main.c去掉系統(tǒng)頭文件的依賴關(guān)系。
        1. [gong@Gong-Computer test]$gcc-M main.c
        2. main.o:main.c/usr/include/stdio.h/usr/include/features.h
        3. /usr/include/sys/cdefs.h/usr/include/bits/wordsize.h
        4. /usr/include/gnu/stubs.h/usr/include/gnu/stubs-32.h
        5. /usr/lib/gcc/i686-redhat-linux/4.5.1/include/stddef.h
        6. /usr/include/bits/types.h/usr/include/bits/typesizes.h
        7. /usr/include/libio.h/usr/include/_G_config.h/usr/include/wchar.h
        8. /usr/lib/gcc/i686-redhat-linux/4.5.1/include/stdarg.h
        9. /usr/include/bits/stdio_lim.h/usr/include/bits/sys_errlist.h
        10. [gong@Gong-Computer test]$gcc-MM main.c
        11. main.o:main.c
        12. [gong@Gong-Computer test]$

        從上面的兩個結(jié)果就可以知道兩個選項的差別,這種差別在編寫Makefile中的依賴關(guān)系時非常的有用。特別是第二種形式是比較重要的方式。

        關(guān)于gcc的使用還是要多實踐才有效果,才能準(zhǔn)確的運用。


        上一頁 1 2 3 下一頁

        關(guān)鍵詞: gcclinux編譯工

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 临西县| 吴江市| 泰顺县| 丘北县| 安岳县| 舒兰市| 阿瓦提县| 双流县| 宝坻区| 平山县| 内丘县| 门头沟区| 翁牛特旗| 宝清县| 芮城县| 寿阳县| 石河子市| 元朗区| 扎囊县| 贵阳市| 威海市| 苏尼特右旗| 沅江市| 阳谷县| 化隆| 金川县| 通榆县| 离岛区| 望奎县| 宝鸡市| 勃利县| 台前县| 梓潼县| SHOW| 海兴县| 闽侯县| 顺昌县| 福建省| 柘城县| 利辛县| 肇州县|