欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
cc的基本用法 - SCO UNIX - ChinaUnix.net
[cc的基本用法]
在UNIX系統中,實(shí)現C源程序到可執行文件的這一轉換過(guò)程的工具是cc。在大多數系統中cc實(shí)際上是一個(gè)shell命令文件。有些系統中的C編譯程序可能并不叫cc而是其它的一個(gè)什么名稱(chēng),如Sun工作站上常用的gcc等等。但這些都無(wú)關(guān)緊要。大多數系統中C編譯命令的用法基本上都是類(lèi)似的。我們這里介紹的將以SVR4上的C編譯系統為基礎。
cc基本用法
一般我們只需要將C源程序的名字寫(xiě)在CC命令行中,cc即可對這些源文件(.c文件)進(jìn)行編譯。如果這些源文件中都沒(méi)有main()函數的定義,那么cc將只能生成與各源文件相對應的目標文件(.o文件)。如果某個(gè)源文件中有關(guān)于main()函數的定義,則將把所有目標文件鏈接起來(lái)生成相應的可執行文件。缺省的情況下這個(gè)可執行文件的名字將是a.out。
例如,假定myprog.c是一個(gè)包含有main()函數定義的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;
}
對于此程序中的錯誤(設計錯誤)我們暫不理會(huì )。下一章我們介紹程序調試時(shí)再回過(guò)頭來(lái)看看如何排除這個(gè)錯誤。
我們看到。在這個(gè)源程序文件中,定義了兩個(gè)函數:TestInput()和main(),定義了一個(gè)宏TESTOK,同時(shí)包含了兩個(gè)標準的頭文件。為了把這個(gè)C程序轉換成可執行文件,在shell提示符下輸入:
$cc myprog.c
在程序中沒(méi)有任何語(yǔ)法錯誤的情況下,cc將在當前目錄下生成一個(gè)名為a.out的可執行文件,如:
$ 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è)可執行文件。當然這個(gè)程序由于在設計上有些失誤,我們現在還不能馬上就帶參數運行。但不帶參數運行還是可以的。只不過(guò)此時(shí)該程序什么都沒(méi)有干,如:
$ a.out
$
在程序中我們通過(guò)main函數的兩個(gè)參數argc和argv而使程序能夠引用shell命令行參數;這是UNIX環(huán)境下一種常用的編程技術(shù)。
在生成了a.out文件之后,我們自然可用mv命令將其修改為某個(gè)合適的名稱(chēng)。但更簡(jiǎn)單的方法是在cc命令行中加上-o選項,使cc直接將可執行文件寫(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中所調用的TestInput()這個(gè)函數不是任何標準的庫函數,在鏈接時(shí)鏈接程序將找不到此符號的定義,故鏈接過(guò)程將以失敗而告終,此時(shí)cc將給出如下的錯誤信息:
Undefine first referenced
symbol in file
TestInput  myprog.o
id: myprog:fatal error: Symbol referencing errors.No output written to myprog
$
而可執行文件myprog也無(wú)法生成。但編譯卻會(huì )生成myprog.c的目標代碼(在某個(gè)文件固有語(yǔ)法錯誤而無(wú)法正確被編譯的情況下(此時(shí)為編譯過(guò)程出錯),cc將生成其他無(wú)語(yǔ)法錯誤的源文件的目標文件,但不進(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í)我們可以使用如下命令行得到可執行文件:
$ cc -o myprog myprog.o myfunc.c
這里我們看到,cc命令行中的文件參數可以不全是.c文件,目標文件(.o)文件以后編譯過(guò)程中所得到的其他文件,如預編譯后文件(.i文件),編譯后的匯編程序(.s文件)等都可作為文件參數。在了解了UNIX C編譯系統的工作過(guò)程之后,理解這一點(diǎn)是不困難的。因為編譯系統只需要對各種不同類(lèi)型的文件進(jìn)行有關(guān)的處理就可以了。
關(guān)于cc命令最基本的用法我們就介紹這么多,其它更高級的用法可參考下面幾節的討論。
常用選項
cc命令還提供了其他許多有用的命令行選項。借助于這些選項我們可以對編譯過(guò)程進(jìn)行進(jìn)一步的控制,如使cc只完成某些階段的編譯工作,指定對頭文件的搜索目錄,指定對代碼進(jìn)行優(yōu)化,指定在代碼中加入一些供調試程序所用的信息,等等。下面我們分別討論這些問(wèn)題。
1.僅進(jìn)行編譯預處理
在命令行中加上-P選項可以使cc僅完成對.c文件的預處理工作,而后面的編譯,匯編,優(yōu)化,鏈接則都不作,例如:
$ cc -P myprog.c
此時(shí)編譯系統將在當前目錄下生成一個(gè)名為myprog.i的文件。這個(gè)文件中包含有對myprog.c中的偽指令進(jìn)行處理后的代碼及myprog.c中原有的代碼。
在某些情況下,.i文件可能對于程序排錯有一定的用處。對于下面的代碼段,編譯程序可能會(huì )報告j無(wú)定義的錯誤:
for (i=0&#59;i<10&#59;i++)
{ /*declare avariable j:
int j&#59;/*This is a temporary variable */
j=i*i&#59;
.
.
.
}
預編譯處理后,缺省情況下,預處理程序將把源程序中的注釋刪除,這樣改段代碼將變成:
for (i=0&#59;i<10&#59;i++)
{
j=i*i&#59;
.
.
.
}
這樣一來(lái)我們將能夠比較快地發(fā)現程序中的錯誤。利用.i文件,我們還能夠對條件編譯和宏擴展后的結果進(jìn)行檢查。
在cc命令行中加上-C選項可以在預編譯后的文件中保留源文件中的注釋。
2.僅生成匯編語(yǔ)言代碼
在cc命令行中加上-S 選項,可以使cc只調用預處理程序和編譯程序以生成與源程序相應的匯編代碼。與每一個(gè)C源文件相應的匯編程序被放到相應的.s文件中。例如:
$ cc -S myprog.c myfunc.c
$ ls *.s
myfunc.s myprog.s
$
這種匯編語(yǔ)言代碼是同機器具體相關(guān)的。有些情況下我們可能需要用匯編語(yǔ)言進(jìn)行編程,這時(shí)可以先用C語(yǔ)言編寫(xiě)此程序,再編譯得到匯編程序,然后手工對此匯編程序修修改改,估計基本上就能滿(mǎn)足要求。由于用匯編語(yǔ)言進(jìn)行編程是一件效率比較低的工作,用此種方法可以預期將獲得比較高的效率。
3.僅生成目標文件
如果只想生成源文件的目標代碼而不對這些代碼進(jìn)行鏈接,可以在cc命令行中加上-C選項。此時(shí)編譯系將只生成與各源文件相對應的.o文件(目標文件)。如:
$ cc -c myprog.c myfunc.s
將生成同myprog.c和myfunc.s相對應的目標文件myprog.o和myfunc.o。
4.頭文件搜索路徑
當用戶(hù)在C源程序中用# include指令包含了某個(gè)頭文件時(shí),根據文件名指定方法的不同,C編譯系統將在不同的目錄下去尋找指定的頭文件:
在用尖括號(<>;)指定頭文件名時(shí),預處理程序將在系統中存放頭文件的標準位置(通常是/usr/include目錄)尋找指定的頭文件。
在用雙引號(“”)指定投文件名時(shí),預處理程序將先在包含此頭文件的C源程序所在的目錄中(一般為當前目錄),去查找該頭文件。找不到時(shí)再到標準目錄下去查找。
在對于那些頭文件既不在標準位置,又不在與C源程序同一目錄時(shí)的情況怎么辦呢?為此,CC命令提供了-I(Include)選項,以供用戶(hù)自己指定頭文件所在地目錄。例如,對于myfunc.c和myprog.c中所包含的頭文件myprog.h,我們假定其后來(lái)被放在目錄$HOME/include目錄下,而這兩個(gè)C文件則被放在$HOME/cfile目錄下。此時(shí)在$HOME/cfile目錄下對這兩個(gè)C文件進(jìn)行編譯時(shí),可使用如下命令:
$ cc -I #HOME/include myprog.c myfunc.c
此時(shí)對于這兩個(gè)C文件中的#include "myprog.h",預處理程序將先在$HOME/cfile目錄下,然后再$HOME/include目錄下,最后再系統標準位置查找myprog.h。-I選項也能改變那些用尖括號(<>
指定的頭文件的搜索順序,此時(shí)預編譯程序將首先在-I指定的目錄下,然后才在標準位置搜索。
-I選項可以多次重復使用。這樣我們將能夠指定多個(gè)非標準的頭文件目錄。
5.在目標文件中加入調試用的信息
除非是那種特別簡(jiǎn)單的程序,一般大多數程序都會(huì )有這樣或那樣的問(wèn)題。為了能夠使用UNIX的符號調試程序(sdb,下一章回具體介紹)對程序進(jìn)行調試,必須在目標代碼中加入一些有關(guān)的程序變量和語(yǔ)句信息,以便sdb能夠跟蹤函數調用、顯示變量的值以及設置斷點(diǎn),等等。
在cc命令行中加入-g選項將能夠實(shí)現上述要求,如:
$ cc -g -o myprog myprog.c myfunc.c
這樣生成的myprog就可以用sdb進(jìn)行調試了。
6.優(yōu)化處理
優(yōu)化的含義前面我們已經(jīng)講過(guò),這里不想再重復。我們要說(shuō)明的是在程序的調試過(guò)程中用不著(zhù)進(jìn)行優(yōu)化處理。優(yōu)化只應對最終提交的可執行程序進(jìn)行。
在CC命令行中加上-O選項可以使編譯系統對代碼進(jìn)行優(yōu)化:
$ cc -O -o myprog myprog.c myfunc.c
優(yōu)化對于不同的程序效果可能是不同的。有些程序優(yōu)化不優(yōu)化都不會(huì )有什么區別。在有些系統上(如Sun OS),對程序的優(yōu)化可以分成不同的級別(一般是1至4級)。第一級優(yōu)化是僅在匯編級上優(yōu)化,這是大多數系統都會(huì )做得。第二級優(yōu)化是全局優(yōu)化,如循環(huán)優(yōu)化、公共子表達式的消除、復寫(xiě)傳播及自動(dòng)寄存器的分配。第三級上的優(yōu)化再加上對外部變量的用法和定義的優(yōu)化。第四級優(yōu)化則在第三級基礎上對指針賦值得效果進(jìn)行跟蹤。程序員可在-O后面加上一個(gè)數字(1,2,3,4)來(lái)表示所希望的優(yōu)化級別。
在cc命令行中還可以使用其他的許多選項,下一節我們將介紹同鏈接有關(guān)的一些選項,其他選項的使用請參閱聯(lián)機幫助?;蛘呤褂檬謨?。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
linux下 怎樣把代碼編譯成庫?
arm
Linux .o a .so .la .lo的區別及l(fā)ibtool相關(guān)介紹
Linux下動(dòng)態(tài)庫(.so)和靜態(tài)庫(.a)
將Linux代碼移植到Windows的簡(jiǎn)單方法(轉貼)
gcc 選項(轉)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久