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下.