【datatime】2006-08-14
【title】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下.