linux下編寫c程序手順

 前段linux學習的小結,分享一下:)。

一、Linux C語言編程環境搭建

    需要以下軟件包

²        gcc:編譯器。

²        cpp:源代碼預處理

²        libgccgcc必須的自身組件

²        libc6:提供C語言運行所需的庫文件和庫文件操作命令

²        binutils:提供輔助工具

    /usr/bin/size個目文件或檔文件的章大小和的大小

    /usr/bin/ar:歸檔文件管理工具,可以創建、修改或打開一個歸檔文件

    /usr/bin/objdump:顯示目標文件的信息

    /usr/bin/strings:顯示一個文件中的可打印字符串

    /usr/bin/ranlib:產生歸檔文件的索引

    /usr/bin/objcopy:複製或轉換目標文件

    /usr/bin/addr2line:把一個地址信息轉換爲文件名和行號

    /usr/bin/readelf:顯示 ELF 文件信息, ELF 文件格式即 Linux 目前流行的可執行文件格式

    /usr/bin/nm:顯示目標文件裏的符號

    /usr/bin/strip:去除目標文件裏的符號

    /usr/bin/asGNU 彙編工具

    /usr/bin/ldGNU 鏈接工具

  /usr/bin/gprof:顯示目標文件的profile數據

²        locals:提供本地語言環境支持

²        libc6-dev:提供c語言庫libc、頭文件

²        manpages-dev:提供man手冊

²        make:維護源代碼

²        gdb :調試程序

²        indent:格式化源代碼

    注:如有需要還可以安裝以下軟件包,以提供參考手冊

²        glibc-doc-reference

²        glibc-doc

²        make-doc

 

二、選擇文件編輯工具

    如果linux爲文本界面,通常有以下幾種選擇:

    1.使用linux提供的VI編輯器

      常用命令:

          vi filename:打開或新建一個文件

          ←→:光標左右移動

↑↓:光標上移/下移一行

i:在光標前插入文本

          I:在當前行首插入文本

          r:替換當前文本

          R:替換當前字符以及其後的字符,至到按ESC

          do:刪至行首

          d$:刪至行尾

          ndd:刪除當前行及其後n-1行,刪除1行的時候可以省略爲dd

          /pattern:從光標開始處向文件尾搜索pattern

          ?pattern:從光標開始處向文件首搜索pattern

          n:在同一方向上重複上一次搜索命令

          N:在相反方向上重複上一次搜索命令

          g/p1/s//p2/g:將文件中所有p1替換爲p2

          最後行方式命令(處於其他模式的場合,按ESC後纔可鍵入命令):

          :q!:退出且不保存變更

          :q:退出,如果有變更,會給出提示

          :w:保存當前文件

          :x:保存變更並退出

    2. windows側編輯文件,通過FTP工具上傳到Linux機器。

    3. 使用UltraEdit連接到linux上,把文件直接保存到Linux機器上

       新建文件:

       File->New新建一個文件

                ->File->FTP->Save As to FTP

                      ->Accounts

                             ->New 沒有linux FTP acconut的場合,創建一個

                             ->Account下拉框中,選擇使用的FTP account

                                   ->選擇文件保存目錄,最好一個程序一個目錄

                                       ->選擇傳輸類型:二進制方式

                                            ->輸入文件名

                                                ->點擊Save As,保存文件

       打開一個既存文件:

        File->FTP->Open From FTP

                      ->Account下拉框中,選擇使用的FTP account

                            ->選擇文件目錄

                                ->選擇傳輸類型:二進制方式

                                    ->雙擊選擇的文件或點擊Open

       文件保存:

       和一般文件相同。ctrl+s或點擊保存按鈕。      

       爲了方便,新建一個工具欄,把Save AS To FTPOpen From FTP等添加到工具欄中。

 

三、程序文件作成

    1.創建一個文件夾,用於存放程序文件和make文件。(便於管理)

    2.作成頭文件(.h文件,用於存放引用的頭文件、宏定義、結構體定義、函數原型等)

      注:最後一行空白

    3.作成.c文件(程序實現)

      注意:linux c的某些函數和windows不同。

            最後一行空白

    4.根據文件的依賴關係作成make文件Makefile

變量定義

        通常會定義以下變量:

²        CC=gcc 編譯器選擇

²        SRC=a.c b.c 指定依賴的.c文件

²        OBJ = $(SRC:.c=.o) OBJ=a.o b.o

指定依賴的object文件。$(SRC:.c=.o)是將所有SRC中的.c文件轉換爲對應的.o文件。

²        HDR=a.h b.h 指定依賴的頭文件

²        INCDIR=-Idir11 -Idir2  指定頭文件搜索目錄

²        LIBDIR=-Ldir1  -Ldir2  指定鏈接庫搜索目錄

²        LIBR=-la -lb  引用庫a, b

²        CFLAGS= -g –Wall -O -Dmacro1  gcc選項:打開調試選項、輸出所有警告信息、進行優化、定義宏macro1

²        BIN=filename 指定最終輸出物件的名字

依賴關係

²        生成動態庫的場合

            all:依賴的Object文件$(OBJ) 最終生成物件$(LIB)

            依賴的Object文件$(OBJ):源代碼$(SRC):頭文件$(HDR)

                        $(CC) -fPIC $(CFLAG) -c $(SRC)

            最終生成物件$(LIB):源代碼$(SRC) 依賴的Object文件$(OBJ)

                      $(CC) -shared $(CFLAGS) $(INCDIR) $(LIBDIR) –o$@ $(OBJ) $(LIBR)

²        生成靜態庫的場合

all:依賴的Object文件$(OBJ) 最終生成物件$(LIB)

依賴的Object文件$(OBJ): 源代碼$(SRC):頭文件$(HDR)

       $(CC) $(CFLAG) $(INCDIR) -c $(SRC)

最終生成物件$(LIB): 源代碼$(SRC):依賴的Object文件$(OBJ)

       $(AR) r $@ $(OBJ)

注:AR=ar

²        生成可執行物件的場合

all:最終生成物件$(BIN)

最終生成物件$(BIN):源文件($SRC) 頭文件($HDR)

$(CC) $(CFLAGS) $(INCDIR) $(LIBDIR) -o $@ $(SRC) $(LIBR)

目標文件清空

  Makefile的最後,加入清空目標文件的規則

   clean:

                  rm –f $(BIN) $(OBJ) rm –f $(BIN) *.o

   或者

.PHONY:clean

clean:

-rm -f $(BIN) $(OBJ) -rm -f $(BIN) *.o

  注:.PHONY顯式的把clean聲明爲一個“僞目標”,是爲了避免同一目錄下存在一個名爲clean的文件的場合下,make clean執行錯誤。

       rm前加”-”:命令執行過程中某個文件出錯的場合,繼續執行

 

四、代碼編譯

    1.執行make命令,編譯代碼。

      爲了方便查看輸出信息,在make 後追加 &>filename,把標準輸出和錯誤輸出都寫到指定文件中。如:make &>result

    2.修改編譯錯誤和警告,再次編譯,直到編譯通過。

      錯誤定位的一些技巧

²        越是低級錯誤,影響範圍越大。檢查第一個錯誤之前的行是否以分號結尾,小括號、中括號、大括號是否匹配等。錯誤找到,修改後,立即重編代碼。這下錯誤少了很多呢,心情是不是也跟着好起來了呢。

²        引用了未定義的系統函數:首先man一下,如果找到對應的手冊,則可能是頭文件沒有引用或引用錯誤;如果沒有找,則可能是Linux側的函數名和windows側的不同。

²        系統函數鏈接錯誤,Makefile gcc命令選項中是否指定了對應鏈接的庫

 

五、程序執行

    1.執行物件

      直接在命令行執行生成物件,查看輸出結果是否正確

      命令:

./filename

文件絕對路徑

    2.動態庫或靜態庫

      作成可執行物件調用庫函數,然後執行可執行物件

 

六、程序調試

    1.一般可執行物件

       gdb filename 啓動gdb並載入程序

    2.進程

²        gdb -p 進程ID gdb attach 進程ID

啓動gdb並載入進程

²        (gdb) set follow-fork-mode [parent | child]

設定fork之後繼續調試父進程還是子進程

²        (gdb) set detach-on-fork [ on | off]

指示gdbfork之後是否斷開(detach)某個進程的調試,或者都交由GDB控制

on: 斷開調試follow-fork-mode指定的進程

off: gdb將控制子進程和父進程,follow-fork-mode指定的進程將被調試,另一個進程處於暫停(suspended)狀態。

注:該命令是在gdb 6.6(包括)以後支持的

    3.常用gdb調試命令

²        list列出產生執行文件的源代碼的一部分(10L)

list function列出某個函數

list 接着前一次繼續顯示

list linenumber 從行linemuber開始顯示10L

²        break 在代碼裏設置斷點

break function 在函數入口設置斷點

break linenumer 在當前源文件的行linenumber處設置斷點

break file:linenmuber 在指定源文件filelinenumber行處設置斷點

²        next 執行一行代碼,而不進入函數內部

²        step 執行一行代碼,並進入函數內部

²        info 查看程序信息

         info br 查看斷點信息

²        continue 繼續執行,直到遇到下一個斷點

²        print 查看變量值,格式: print  [/F] 參數  F爲輸出格式

       常用格式:

x 16進制整數格式

d 有符號十進制整數格式

u 無符號十進制整數格式

f 浮點數格式

²        set  修改變量的值,格式set 參數=

²        clear 刪除一個斷點,以函數名或行號作爲參數

²        disable 禁止某個斷點,參數是斷點在斷點列表中的索引,使用info br可以看到

²        enable  允許某個斷點功能,參數同disable

²        quit  終止 gdb

 

 

~~

 

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