乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      cc的基本用法 - SCO UNIX - ChinaUnix.net

       lovelydog 2006-01-04
      [cc的基本用法]
      在UNIX系統(tǒng)中,實(shí)現(xiàn)C源程序到可執(zhí)行文件的這一轉(zhuǎn)換過(guò)程的工具是cc。在大多數(shù)系統(tǒng)中cc實(shí)際上是一個(gè)shell命令文件。有些系統(tǒng)中的C編譯程序可能并不叫cc而是其它的一個(gè)什么名稱,如Sun工作站上常用的gcc等等。但這些都無(wú)關(guān)緊要。大多數(shù)系統(tǒng)中C編譯命令的用法基本上都是類似的。我們這里介紹的將以SVR4上的C編譯系統(tǒng)為基礎(chǔ)。
      cc基本用法
      一般我們只需要將C源程序的名字寫(xiě)在CC命令行中,cc即可對(duì)這些源文件(.c文件)進(jìn)行編譯。如果這些源文件中都沒(méi)有main()函數(shù)的定義,那么cc將只能生成與各源文件相對(duì)應(yīng)的目標(biāo)文件(.o文件)。如果某個(gè)源文件中有關(guān)于main()函數(shù)的定義,則將把所有目標(biāo)文件鏈接起來(lái)生成相應(yīng)的可執(zhí)行文件。缺省的情況下這個(gè)可執(zhí)行文件的名字將是a.out。
      例如,假定myprog.c是一個(gè)包含有main()函數(shù)定義的C語(yǔ)言程序文件,其中代碼如下:
      /*********************************************
      * An example source code with errors *
      * Name:myprog.c  *
      ********************************************* /
      #include <stdio.h>;
      #include <ctype.h>;
      # define TESTOK 1
      int TestInput(char * ValuInput)
      {while (* ValueInput)
      if (! isdigit(* ValueInput )) return (! TESTOK)&#59;
      else  ValueInput + +&#59;
      return ((100/atoi(ValueInput))? TESTOK:! TESTOK)&#59;
      }
      void
      main(int argc,char * argv[])
      {int i&#59;
      for (i=1&#59;i<argc&#59;&#59;i++)
      if(TestInput (argv) = =TESTOK)
      printf("The %dth value ‘%s‘ \tis OK! \n",i,argv)&#59;
      else
      printf("The %dth value ‘%s‘ \tis BAD! \n" ,i,argv)&#59;
      }
      對(duì)于此程序中的錯(cuò)誤(設(shè)計(jì)錯(cuò)誤)我們暫不理會(huì)。下一章我們介紹程序調(diào)試時(shí)再回過(guò)頭來(lái)看看如何排除這個(gè)錯(cuò)誤。
      我們看到。在這個(gè)源程序文件中,定義了兩個(gè)函數(shù):TestInput()和main(),定義了一個(gè)宏TESTOK,同時(shí)包含了兩個(gè)標(biāo)準(zhǔn)的頭文件。為了把這個(gè)C程序轉(zhuǎn)換成可執(zhí)行文件,在shell提示符下輸入:
      $cc myprog.c
      在程序中沒(méi)有任何語(yǔ)法錯(cuò)誤的情況下,cc將在當(dāng)前目錄下生成一個(gè)名為a.out的可執(zhí)行文件,如:
      $ cc myproc.c
      $ ls -l
      -rwx------ 1 yxz users 5812 Aug 31 15:32 a.out
      -rw------- 1 yxz users 716 Aug 31 15:27 myproc.c
      $
      還可以看到這里a.out是一個(gè)可執(zhí)行文件。當(dāng)然這個(gè)程序由于在設(shè)計(jì)上有些失誤,我們現(xiàn)在還不能馬上就帶參數(shù)運(yùn)行。但不帶參數(shù)運(yùn)行還是可以的。只不過(guò)此時(shí)該程序什么都沒(méi)有干,如:
      $ a.out
      $
      在程序中我們通過(guò)main函數(shù)的兩個(gè)參數(shù)argc和argv而使程序能夠引用shell命令行參數(shù);這是UNIX環(huán)境下一種常用的編程技術(shù)。
      在生成了a.out文件之后,我們自然可用mv命令將其修改為某個(gè)合適的名稱。但更簡(jiǎn)單的方法是在cc命令行中加上-o選項(xiàng),使cc直接將可執(zhí)行文件寫(xiě)入到指定的文件中而不生成a.out文件,如:
      $ cc -o myprog myprog.c
      $ ls -l myprog
      total 14
      -rwx------ 1 yxz users 5812 Aug 31 15:34 myprog
      -rw------- 1 yxz users  716 Aug 31 15:27 myprog.c
      $
      我們看到,myprog這個(gè)文件除了文件名及修改時(shí)間同a.out不一樣外,其他屬性同a.out都是一摸一樣的。這也說(shuō)明了兩者的等價(jià)性。
      在某個(gè)程序的源代碼被存放到多個(gè)不同文件中的情況下,我們只需要在命令行中一一指定這多個(gè)C文件即可。例如,我們可以將上述myprog.c拆分為兩個(gè)C文件和一個(gè)頭文件(.h)如下:
      myprog.h
      # include <stdio.h>;
      # inclued <ctype.h>;
      # define TESTOK 1
      myprog.c
      #include "myprog.h"
      void
      main (int argc,char * argv[])
      {int i&#59;
      for (i=1&#59;i<argc&#59;i + +)
      if (TestInput(argv)= = TESTOL)
      printf("The %dth value ‘%s‘ \tis ok! \n",argv[1])&#59;
      else
      printf("The %dth value ‘ %s‘ \tis BAD! \n",iargv);
      }
      myfunc.c
      #include "myprog.h"
      int
      TestInput(char * ValueInput)
      {while (* ValueInput)
       if (!isdigit(*ValueInput) return (! TESTOK)&#59;
       else ValueInput + +
      return ((100/atoi(ValueInput))? TESTOK:! TESTOK)&#59;
      這時(shí)要再編譯此程序時(shí)可輸入如下命令:
      $ cc -o myprog myprog.c myfunc.c
      在這個(gè)命令行中如果不指定myfunc.c,此時(shí)由于在myprog.c中所調(diào)用的TestInput()這個(gè)函數(shù)不是任何標(biāo)準(zhǔn)的庫(kù)函數(shù),在鏈接時(shí)鏈接程序?qū)⒄也坏酱朔?hào)的定義,故鏈接過(guò)程將以失敗而告終,此時(shí)cc將給出如下的錯(cuò)誤信息:
      Undefine first referenced
      symbol in file
      TestInput  myprog.o
      id: myprog:fatal error: Symbol referencing errors.No output written to myprog
      $
      而可執(zhí)行文件myprog也無(wú)法生成。但編譯卻會(huì)生成myprog.c的目標(biāo)代碼(在某個(gè)文件固有語(yǔ)法錯(cuò)誤而無(wú)法正確被編譯的情況下(此時(shí)為編譯過(guò)程出錯(cuò)),cc將生成其他無(wú)語(yǔ)法錯(cuò)誤的源文件的目標(biāo)文件,但不進(jìn)行鏈接)。如下:
      $ ls -l
      total 8
      rw-r--r-- 1 yxz user 454 Sep 1 09:27 myfunc.c
      rw-r--r-- 1 yxz user 479 Sep 1 09:28 myprog.c
      rw-r--r-- 1 yxz user 298 Sep 1 09:27 myprog.h
      rw-r--r-- 1 yxz user 924 Sep 1 09:28 myfunc.o
      此時(shí)我們可以使用如下命令行得到可執(zhí)行文件:
      $ cc -o myprog myprog.o myfunc.c
      這里我們看到,cc命令行中的文件參數(shù)可以不全是.c文件,目標(biāo)文件(.o)文件以后編譯過(guò)程中所得到的其他文件,如預(yù)編譯后文件(.i文件),編譯后的匯編程序(.s文件)等都可作為文件參數(shù)。在了解了UNIX C編譯系統(tǒng)的工作過(guò)程之后,理解這一點(diǎn)是不困難的。因?yàn)榫幾g系統(tǒng)只需要對(duì)各種不同類型的文件進(jìn)行有關(guān)的處理就可以了。
      關(guān)于cc命令最基本的用法我們就介紹這么多,其它更高級(jí)的用法可參考下面幾節(jié)的討論。
      常用選項(xiàng)
      cc命令還提供了其他許多有用的命令行選項(xiàng)。借助于這些選項(xiàng)我們可以對(duì)編譯過(guò)程進(jìn)行進(jìn)一步的控制,如使cc只完成某些階段的編譯工作,指定對(duì)頭文件的搜索目錄,指定對(duì)代碼進(jìn)行優(yōu)化,指定在代碼中加入一些供調(diào)試程序所用的信息,等等。下面我們分別討論這些問(wèn)題。
      1.僅進(jìn)行編譯預(yù)處理
      在命令行中加上-P選項(xiàng)可以使cc僅完成對(duì).c文件的預(yù)處理工作,而后面的編譯,匯編,優(yōu)化,鏈接則都不作,例如:
      $ cc -P myprog.c
      此時(shí)編譯系統(tǒng)將在當(dāng)前目錄下生成一個(gè)名為myprog.i的文件。這個(gè)文件中包含有對(duì)myprog.c中的偽指令進(jìn)行處理后的代碼及myprog.c中原有的代碼。
      在某些情況下,.i文件可能對(duì)于程序排錯(cuò)有一定的用處。對(duì)于下面的代碼段,編譯程序可能會(huì)報(bào)告j無(wú)定義的錯(cuò)誤:
      for (i=0&#59;i<10&#59;i++)
      { /*declare avariable j:
      int j&#59;/*This is a temporary variable */
      j=i*i&#59;
      .
      .
      .
      }
      預(yù)編譯處理后,缺省情況下,預(yù)處理程序?qū)言闯绦蛑械淖⑨寗h除,這樣改段代碼將變成:
      for (i=0&#59;i<10&#59;i++)
      {
      j=i*i&#59;
      .
      .
      .
      }
      這樣一來(lái)我們將能夠比較快地發(fā)現(xiàn)程序中的錯(cuò)誤。利用.i文件,我們還能夠?qū)l件編譯和宏擴(kuò)展后的結(jié)果進(jìn)行檢查。
      在cc命令行中加上-C選項(xiàng)可以在預(yù)編譯后的文件中保留源文件中的注釋。
      2.僅生成匯編語(yǔ)言代碼
      在cc命令行中加上-S 選項(xiàng),可以使cc只調(diào)用預(yù)處理程序和編譯程序以生成與源程序相應(yīng)的匯編代碼。與每一個(gè)C源文件相應(yīng)的匯編程序被放到相應(yīng)的.s文件中。例如:
      $ cc -S myprog.c myfunc.c
      $ ls *.s
      myfunc.s myprog.s
      $
      這種匯編語(yǔ)言代碼是同機(jī)器具體相關(guān)的。有些情況下我們可能需要用匯編語(yǔ)言進(jìn)行編程,這時(shí)可以先用C語(yǔ)言編寫(xiě)此程序,再編譯得到匯編程序,然后手工對(duì)此匯編程序修修改改,估計(jì)基本上就能滿足要求。由于用匯編語(yǔ)言進(jìn)行編程是一件效率比較低的工作,用此種方法可以預(yù)期將獲得比較高的效率。
      3.僅生成目標(biāo)文件
      如果只想生成源文件的目標(biāo)代碼而不對(duì)這些代碼進(jìn)行鏈接,可以在cc命令行中加上-C選項(xiàng)。此時(shí)編譯系將只生成與各源文件相對(duì)應(yīng)的.o文件(目標(biāo)文件)。如:
      $ cc -c myprog.c myfunc.s
      將生成同myprog.c和myfunc.s相對(duì)應(yīng)的目標(biāo)文件myprog.o和myfunc.o。
      4.頭文件搜索路徑
      當(dāng)用戶在C源程序中用# include指令包含了某個(gè)頭文件時(shí),根據(jù)文件名指定方法的不同,C編譯系統(tǒng)將在不同的目錄下去尋找指定的頭文件:
      在用尖括號(hào)(<>;)指定頭文件名時(shí),預(yù)處理程序?qū)⒃谙到y(tǒng)中存放頭文件的標(biāo)準(zhǔn)位置(通常是/usr/include目錄)尋找指定的頭文件。
      在用雙引號(hào)(“”)指定投文件名時(shí),預(yù)處理程序?qū)⑾仍诎祟^文件的C源程序所在的目錄中(一般為當(dāng)前目錄),去查找該頭文件。找不到時(shí)再到標(biāo)準(zhǔn)目錄下去查找。
      在對(duì)于那些頭文件既不在標(biāo)準(zhǔn)位置,又不在與C源程序同一目錄時(shí)的情況怎么辦呢?為此,CC命令提供了-I(Include)選項(xiàng),以供用戶自己指定頭文件所在地目錄。例如,對(duì)于myfunc.c和myprog.c中所包含的頭文件myprog.h,我們假定其后來(lái)被放在目錄$HOME/include目錄下,而這兩個(gè)C文件則被放在$HOME/cfile目錄下。此時(shí)在$HOME/cfile目錄下對(duì)這兩個(gè)C文件進(jìn)行編譯時(shí),可使用如下命令:
      $ cc -I #HOME/include myprog.c myfunc.c
      此時(shí)對(duì)于這兩個(gè)C文件中的#include "myprog.h",預(yù)處理程序?qū)⑾仍?HOME/cfile目錄下,然后再$HOME/include目錄下,最后再系統(tǒng)標(biāo)準(zhǔn)位置查找myprog.h。-I選項(xiàng)也能改變那些用尖括號(hào)(<>指定的頭文件的搜索順序,此時(shí)預(yù)編譯程序?qū)⑹紫仍?I指定的目錄下,然后才在標(biāo)準(zhǔn)位置搜索。
      -I選項(xiàng)可以多次重復(fù)使用。這樣我們將能夠指定多個(gè)非標(biāo)準(zhǔn)的頭文件目錄。
      5.在目標(biāo)文件中加入調(diào)試用的信息
      除非是那種特別簡(jiǎn)單的程序,一般大多數(shù)程序都會(huì)有這樣或那樣的問(wèn)題。為了能夠使用UNIX的符號(hào)調(diào)試程序(sdb,下一章回具體介紹)對(duì)程序進(jìn)行調(diào)試,必須在目標(biāo)代碼中加入一些有關(guān)的程序變量和語(yǔ)句信息,以便sdb能夠跟蹤函數(shù)調(diào)用、顯示變量的值以及設(shè)置斷點(diǎn),等等。
      在cc命令行中加入-g選項(xiàng)將能夠?qū)崿F(xiàn)上述要求,如:
      $ cc -g -o myprog myprog.c myfunc.c
      這樣生成的myprog就可以用sdb進(jìn)行調(diào)試了。
      6.優(yōu)化處理
      優(yōu)化的含義前面我們已經(jīng)講過(guò),這里不想再重復(fù)。我們要說(shuō)明的是在程序的調(diào)試過(guò)程中用不著進(jìn)行優(yōu)化處理。優(yōu)化只應(yīng)對(duì)最終提交的可執(zhí)行程序進(jìn)行。
      在CC命令行中加上-O選項(xiàng)可以使編譯系統(tǒng)對(duì)代碼進(jìn)行優(yōu)化:
      $ cc -O -o myprog myprog.c myfunc.c
      優(yōu)化對(duì)于不同的程序效果可能是不同的。有些程序優(yōu)化不優(yōu)化都不會(huì)有什么區(qū)別。在有些系統(tǒng)上(如Sun OS),對(duì)程序的優(yōu)化可以分成不同的級(jí)別(一般是1至4級(jí))。第一級(jí)優(yōu)化是僅在匯編級(jí)上優(yōu)化,這是大多數(shù)系統(tǒng)都會(huì)做得。第二級(jí)優(yōu)化是全局優(yōu)化,如循環(huán)優(yōu)化、公共子表達(dá)式的消除、復(fù)寫(xiě)傳播及自動(dòng)寄存器的分配。第三級(jí)上的優(yōu)化再加上對(duì)外部變量的用法和定義的優(yōu)化。第四級(jí)優(yōu)化則在第三級(jí)基礎(chǔ)上對(duì)指針賦值得效果進(jìn)行跟蹤。程序員可在-O后面加上一個(gè)數(shù)字(1,2,3,4)來(lái)表示所希望的優(yōu)化級(jí)別。
      在cc命令行中還可以使用其他的許多選項(xiàng),下一節(jié)我們將介紹同鏈接有關(guān)的一些選項(xiàng),其他選項(xiàng)的使用請(qǐng)參閱聯(lián)機(jī)幫助?;蛘呤褂檬謨?cè)。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多