linux:C編寫基礎

Gcc編譯:Gcc [選項]要編譯的文件 [選項][目標文件]
 1.預編譯:gcc -E hello.c -o hello.i //-E選項只進行預處理,把相關庫文件包含進來,預處理後停止編譯過程.
 2.編譯:  gcc -S hello.i -o hello.s //此階段檢查代碼規範性,語法並翻譯成彙編.-S選項只編譯不彙編,生成彙編代碼.
 3.彙編:  gcc -c hello.s -o hello.o //生成各功能源文件的目標文件.-c只編譯不鏈接,生成目標文件".o"
 4.鏈接:  gcc hello.o  src/hello2.o -o hello //鏈接各源文件生成的目標文件,生成可執行文件(可執行文件裏要有main函數)
         其他選項: -g 在可執行程序中包含標準調試信息
                   -o file 把輸出文件輸出到file裏
                   -Wall 提供所有可用報警信息
ps:1.分別用-c選項在各個功能源文件夾生成各功能的目標文件
   2.各個功能源文件夾裏要放置用到的本地庫文件,使用引號,例#include"xx.h"
    (發現即使各個源文件裏不包含實際使用到的本地庫文件,生成目標文件,最後鏈接成可執行文件也是可以的.但爲了可移植性,還是需要按標準做法    ,即各源文件裏一定要包含實際使用到的本地庫文件)

   

Gdb調試:1.首先在編譯時,要使用-g選項把調試信息加到可執行文件中.
                 2.gdb調試的是可執行文件,因此首先要通過gcc編譯生成可執行文件,才能進行調試.
                         file 裝入想要調試的可執行文件.
                         kill 終止正在調試的程序.
                         list 列出產生執行文件的源代碼的一部分.
                         next 執行一行源代碼但不進入函數內部.
                         step 執行一行源代碼而且進入函數內部.
                         run 執行當前被調試的程序
                         quit 終止 gdb
                        watch 使你能監視一個變量的值而不管它何時被改變.
                        break 在代碼裏設置斷點, 這將使程序執行到這裏時被掛起.
                        make 使你能不退出 gdb 就可以重新產生可執行文件.
                        shell 使你能不離開 gdb 就執行 UNIX shell 命令.

make管理器:能夠根據文件時間戳自動發現更新過的文件而減少編譯的工作量,同時,它通過讀入Makefile文件的內容來執行大量的編譯工作.用戶只需編寫一次簡單的編譯語句就可以了.
    makefile格式:   target:dependency_files
                            command
           自己寫makefile時候可以使用makefile變量

使用autotools生成makefile:
1.運行autoscan:在給定工程根目錄或源文件子目錄中檢查源文件,生成"configure.scan"文件.

修改"configure.scan"文件,大致上修改以下部分即可:
AC_INIT(target.c) //源代碼在當前目錄                     AC_INIT(src/target.c) //源代碼在當前目錄的src子目錄
                                //如果有多個源文件,請以空格隔開
AM_INIT_AUTOMAKE(軟件名稱, 版本號)           AM_INIT_AUTOMAKE(軟件名稱, 版本號)  AC_PROG_CC                                                             AC_PROG_CC
AC_OUTPUT(makefile) //輸出當前目錄下的makefile  AC_OUTPUT(makefile src/Makefile) //分別輸出當前目錄和src目錄的makefile
修改後重命名"configure.scan"爲"configure.ac"或者"configure.in"
2.需要爲每個源碼目錄創建"makefile.am"文件,指定編譯後的目標文件名target以及依賴的源文件source等等.編輯如下:
  bin_PROGRAMS=target //輸出單個目標文件             bin_PROGRAMS=target1 target2 //輸出多個目標文件
  target_SOURCES=source //以空格分開各源文件和庫文件;target1_SOURCES=source //以空格分開target1依賴的源文件和庫文件
                                                    target2_SOURCES=source //以空格分開target2依賴的源文件和庫文件
 工程根目錄下就算沒有源代碼,也要創建makefile.am文件,指明源代碼子目錄,內容爲:SUBDIRS =源代碼子目錄

例子:SUBDIRS=lib      //當前文件夾的子文件夾裏也要make,所以需要指定子文件夾
         bin_PROGRAMS=hello //當前文件夾裏需要生成可執行文件hello
         hello_SOURCES=hello.c //可執行文件使用當前文件夾裏的hello.c文件生成
         hello_LDADD=lib/libhello.a  //生成可執行文件還需用到靜態庫libhello.a
3.在工程根目錄依次運行如下命令(可在工程根目錄下生成腳本文件,同時執行該步驟各命令):
 aclocal:生成一個"aclocal.m4"文件,該文件主要處理本地的宏定義.
 autoconf:以"configure.ac"爲input,生成"configure"可執行文件
 autoheader:以configure.in爲輸入,產生名爲config.h.in的文件.configure在產生makefile的同時,還以config.h.in爲輸入,產生config.h.這個文件實際上是將若干-DXXX編譯flag以#define xxx的形式放在同一個文件中,從而避免了編譯過程中出現冗長的編譯標誌.
  automake:以"makefile.am"爲輸入,產生需要的makefile.in文件(可以使用選項" --add-missing"來讓automake自動添加一些必需的腳本文件)
4.運行configure:以"makefile.in"爲輸入,產生需要的makefile
5.運行make:默認執行make all命令,生成在makefile.am中定義的目標文件.
ps:1.如果沒有本地宏定義,可以略去aclocal命令
     2.第1步AC_OUTPUT(XXX)中的文件名XXX與第2步:"vi XXX.AM"的文件名必須一致,可爲任意名字,經過第4步後生成XXX文件(makefile),但make命令只能使用makefile,因此此時需要XXX改名成makefile後再使用make命令
     3.make命令後生成可執行文件,其文件名即第2步中的target
     4.我編寫的執行步驟2的腳本文件autogen.sh內容如下:

                     #!/bin/sh
                    echo "Now,command "aclocal" is executed!"
                    aclocal
                    echo "Now,command "autoconf" is executed!"
                    autoconf
                    echo "Now,command "autoheader" is executed!"
                    autoheader
                    echo "Now,comnand "automake --add-missing" is executed!"
                    touch NEWS README AUTHORS ChangeLog
                    automake --add-missing

       autogen.sh爲權限爲可執行.

 

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