一篇關於GCC的轉載的文章 很好。。。。

gcc格式
gcc [-c 編譯,不連接] [-S] [-E] [-std] [-g 加入調試信息] [-pg加入剖析信息] [-Olevel]
    [-W 警告設置] [-pedantic 發出所有標準C列出的警告] [-Idir 添加包含目錄到搜索列表中] [-Ldir添加庫目錄到搜索列表中]
    [-D] [-U] [-f] [-m] [-o 編譯到可執行文件,並作一些優化]...
說明:
    -w       關閉所有警告設置
    -Wall    允許發出所有警告
    -werror  把所有警告轉化爲錯誤
    -v       顯示編譯過程中的每一步用到的命令
    -ggdb    在可執行程序中包含大量的調試信息
    -MM      輸出一個make兼容的相關列表
    -O       優化編譯過的代碼
    -fsyntax-only  只檢查語法,其他都不做
    -save-temps 保存編譯過程中產生的中間文件
    -Q       編譯器輸出編譯每個函數時所花的時間信息
gcc的優化選項:
    -O等價於-O1,並且包含線程直接跳轉和遲延堆棧這兩種優化。
    -O2包含了-O1的優化選項,並增加了一些額外的調整,如包含對處理器指令調度的調整。
    -O3也類似
gcc的調試選項:
    -g == -g2,該級別包括擴展符號表、行號、以及局部變量或外部變量。-g3除了包含-g2的信息外,還包含了源代碼中定義的宏.
gcc的擴展:
    數據類型,如 long long來表示64位的存儲單元。
    內聯函數,inline關鍵字只是一個建議而不是指令,內聯的優化由編譯器分析完成。
    函數和變量的屬性,關鍵字attribute,在函數或是變量的尾部加上_attribute_((屬性名))來完成。
    void FunctionName() _attribute_((noreturn)); /* 不返回值 */
    int int_var _attribute((aligned 16)) = 0; /* 對齊到16位 */
    註釋,//呵呵,這個在標準c中沒有,標準c中的註釋是/* */。
    構造函數名稱,使用_FUNCTION_就可以輸出當前調用函數的名稱。如
    void main(void)
    {
         printf("%s", _FUNCTION_);
    }
【title】make的使用
    Makefile規則格式如下:
    target : dependency [dependency [...]]
             command
             command
             [...]
    target爲目標體,即make要創建的文件;dependency依賴體,必須有依賴文件,即頭文件和目標文件或源文件;
    警告:
    每個命令的第一字符必須爲製表符,不能用8個空格來代替。
    Example:
    1.創建一個Makefile文件,用文本編輯
    2.輸入下列代碼
    helloworld : main.o function.o function.h
 gcc main.o function.o -o helloworld
    main.o :  main.c function.h
 gcc -c main.c
    function.o : function.c function.h
 gcc -c function.c
    all : helloworld
    clean : /* 只是個動作 ,並不真的刪除.o文件 */
 rm *.o
    3.在目錄中輸入make就可以得到編譯的文件了。

【error | make: **No targets specified and on makefile founcd. stop | 缺少Makefile文件名的文件】
【error | make: Circular function.o <- function.o dependency dropped | 依賴文件錯誤】
【error | on newline at end of file | 需要在每一個源文件的最後敲入一個回車符】

    在加入.PHONY後,就直接執行Makefile文件中的命令。
    make讀取環境變量,如果在Makefile文件中有同名的變量,則這個變量取代環境變量。
    make命令的命令行參數:
        -f file    指定的makefile文件名
        -n         打印將要執行的命令
        -Idirname  指定被包含的makefile所在的目錄
        -s         在執行時不打印命令名
        -w         如果在make執行時改變目錄, 打印當前目錄
        -Wfile     如果文件已修改,則使用-n來顯示make將要執行的命令
        -r         禁用所有的make的內置規則
        -d         打印調試信息
        -i         忽略返回的非零錯誤
        -k         直到目標編譯終止後停止,忽略中間的編譯失敗
        -jN        每次允許N條命令
    使用include指令來包含多個make文件。如果想忽略include文件,將用-include指令來代替include指令。

【title】比較和合並源代碼文件
    diff命令的使用:
        格式:diff [options] srcfile dstfile
        options參數:
        -a        將所有的文件看作爲文本,逐行進行比較
        -b        忽略空白數目改變
        -B        忽略插入或刪除空行造成的改變
        -H        修改diff處理大文件的方式
        -i        忽略大小寫
        -w        逐行比較時忽略空白
    這個工具沒搞明白,好像出了點問題,輸出的與書本上的例子不一致。

【title】版本管理與控制 RCS(Revision Control System)和CVS(Concurrent Version System)
    RCS的基本用法,ci和co,ci表示檢入文件到RCS庫中;co表示檢出文件;
    在第一次檢入某個文件到RCS庫中時,系統需要你輸入文件的描述信息,用"."來結束輸入。使用-i來告訴RCS這是首次檢入的文件。
    檢出文件用co -l 文件名。 -r可以指定檢入或檢出的文件的版本。
    RCS的關鍵字:$Id$ $Log$ $Author$ $Date$ $Header$ $Locker$ $Name$ $RCSfile$ $Revision$ $Source$ $State$ 這些關鍵字可以嵌入到
    程序中,利用ident命令可以顯示關鍵字信息。如:文件pen_env
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    static char rcsid[] = "$Id$/n";
   
    int main(void)
    {
        extern char  **environ;
        char **my_env = environ;
        while (*my_env)
        {
            printf("%s/n", *my_env);
            my_env++;
         }
         exit(EXIT_SUCCESS);
     }
     用make prn_env.c編譯後,在命令行輸入$ident prn_env就可以得到$Id$的信息。
     用$rlog 文件名就可以從RCS數據庫中檢出該文件被修改的日誌信息了。

     CVS的使用:
     1.使用$cvs -d dir init命令初始化cvs庫。
     2.設置環境變量$CVSROOT,命令export CVSROOT = dir。
     3.導入目錄到CVS中,先在CVSROOT下建立一個目錄cdir,然後用命令cvs import [-m msg] cdir lpu2 start,執行就自動把當前目錄中的文件導入到cvs/cdir下.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章