免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

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

聯(lián)系客服