




已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第一部分,用記事本寫C程序,并編譯。 剛裝好的系統(tǒng)中已經(jīng)有GCC了,但是這個GCC什么文件都不能編譯,因為沒有一些必須的頭文件,所以要安裝build-essential這個軟件包,安裝了這個包會自動安裝上g+,libc6-dev,linux-libc-dev,libstdc+6-4.1-dev等一些必須的軟件和頭文件的庫。 可以在新立得里面搜索build-essential或輸入下面命令: 代碼: sudo apt-get install build-essential 安裝完成后寫一個C語言程序testc.c測試一下。 在gedit中新建一個空白文本文檔,為了方便就保存在主文件夾中吧,(因為在任一地方啟動終端,直接就到了主文件夾的目錄下),可以直接編譯的。 應(yīng)用程序附件文本編輯器 寫如下代碼: #include int main() printf(Hello zhouxiongfei welcome to Ubuntu!); return 0; 保存為notec.c 應(yīng)用程序附件終端 輸入命令(第一條命令是編譯,第二條命令是執(zhí)行): Ubuntu:$zhouxiongfeiUbuntu:$ gcc notec.c -o notec zhouxiongfeiUbuntu:$ ./notec Hello zhouxiongfei welcome to Ubuntu! zhouxiongfeiUbuntu:$ 記事本寫C并用g+纊譯 同樣,啟動記事本gedit 寫代碼: #include using namespace std; int main() coutHi,learning c+ in g+endl; return 0; 保存在主文件夾目錄下,名字就叫noteplus.cpp 啟動終端,執(zhí)行命令: zhouxiongfeiUbuntu:$ g+ noteplus.cpp -o noteplus zhouxiongfeiUbuntu:$ ./noteplus Hi,learning c+ in g+ zhouxiongfeiUbuntu:$ 提示,編譯C程序的三條命令(本部分轉(zhuǎn)自網(wǎng)絡(luò)) g+ -Wall hellocpp.cpp gcc -Wall hellocpp.cpp -lstdc+ gfortran -Wall hellocpp.cpp -lstdc+ 以上三條命令都是用來編譯C程序的。(假定源程序名為:hellocpp.cpp) 選項 -Wall 開啟編譯器幾乎所有常用的警告強烈建議你始終使用該選項 注意:開始之前請確保已經(jīng)安裝了 build-essential 軟件包 編譯簡單的 C 程序 C 語言經(jīng)典的入門例子是 Hello World,下面是一示例代碼: 代碼: #include int main(void) printf(Hello, world!n); return 0; 我們假定該代碼存為文件hello.c。要用 gcc 編譯該文件,使用下面的命令: 代碼: $ gcc -Wall hello.c -o hello 該命令將文件hello.c中的代碼編譯為機器碼并存儲在可執(zhí)行文件 hello中。機器碼的文件名是通過 -o 選項指定的。該選項通常作為命令行中的最后一個參數(shù)。如果被省略,輸出文件默認為 a.out。 注意到如果當前目錄中與可執(zhí)行文件重名的文件已經(jīng)存在,它將被復(fù)蓋。 選項 -Wall 開啟編譯器幾乎所有常用的警告強烈建議你始終使用該選項。編譯器有很多其他的警告選項,但 -Wall 是最常用的。默認情況下GCC 不會產(chǎn)生任何警告信息。當編寫 C 或 C+ 程序時編譯器警告非常有助于檢測程序存在的問題。 本例中,編譯器使用了 -Wall 選項而沒產(chǎn)生任何警告,因為示例程序是完全合法的。 要運行該程序,輸入可執(zhí)行文件的路徑如下: 代碼: $ ./hello Hello, world! 這將可執(zhí)行文件載入內(nèi)存,并使 CPU 開始執(zhí)行其包含的指令。 路徑 ./ 指代當前目錄,因此 ./hello 載入并執(zhí)行當前目錄下的可執(zhí)行文件 hello。 捕捉錯誤 如上所述,當用 C 或 C+ 編程時,編譯器警告是非常重要的助手。為了說明這一點,下面的例子包含一個微妙的錯誤:為一個整數(shù)值錯誤地指定了一浮點數(shù)控制符%f。 代碼: #include int main (void) printf (Two plus two is %fn, 4); return 0; 一眼看去該錯誤并不明顯,但是它可被編譯器捕捉到,只要啟用了警告選項 -Wall。 編譯上面的程序bad.c,將得到如下的消息: 代碼: $ gcc -Wall bad.c -o bad bad.c: In function main: bad.c:6: warning: double format, different type arg (arg 2) 這表明文件 bad.c第 6 行中的格式字符串用法不正確。GCC 的消息總是具有下面的格式 文件名:行號:消息。編譯器對錯誤與警告區(qū)別對待,前者將阻止編譯,后者表明可能存在的問題但并不阻止程序編譯。 本例中,對整數(shù)值來說,正確的格式控制符應(yīng)該是 %d。 如果不啟用 -Wall,程序表面看起來編譯正常,但是會產(chǎn)生不正確的結(jié)果: 代碼: $ gcc bad.c -o bad $ ./bad Two plus two is 2.585495 顯而易見,開發(fā)程序時不檢查警告是非常危險的。如果有函數(shù)使用不當,將可能導(dǎo)致程序崩潰或產(chǎn)生錯誤的結(jié)果。開啟編譯器警告選項 -Wall 可捕捉 C 編程時的多數(shù)常見錯誤。 編譯多個源文件 一個源程序可以分成幾個文件。這樣便于編輯與理解,尤其是程序非常大的時候。這也使各部分獨立編譯成為可能。 下面的例子中我們將程序 Hello World 分割成 3 個文件:main.c,hello_fn.c和頭文件hello.h。這是主程序main.c: 代碼: #include hello.h int main(void) hello (world); return 0; 在先前的例子hello.c中,我們調(diào)用的是庫函數(shù) printf,本例中我們用一個定義在文件hello_fn.c中的函數(shù) hello 取代它。 主程序中包含有頭文件hello.h,該頭文件包含函數(shù) hello 的聲明。我們不需要在main.c文件中包含系統(tǒng)頭文件stdio.h來聲明函數(shù) printf,因為main.c沒有直接調(diào)用 printf。 文件hello.h中的聲明只用了一行就指定了函數(shù) hello 的原型。 代碼: void hello (const char * name); 函數(shù) hello 的定義在文件hello_fn.c中: 代碼: #include #include hello.h void hello (const char * name) printf (Hello, %s!n, name); 語句 #include FILE.h 與 #include 有所不同:前者在搜索系統(tǒng)頭文件目錄之前將先在當前目錄中搜索文件FILE.h,後者只搜索系統(tǒng)頭文件而不查看當前目錄。 要用gcc編譯以上源文件,使用下面的命令: 代碼: $ gcc -Wall main.c hello_fn.c -o newhello 本例中,我們使用選項 -o 為可執(zhí)行文件指定了一個不同的名字 newhello。注意到頭文件hello.h并未在命令行中指定。源文件中的的 #include hello.h 指示符使得編譯器自動將其包含到合適的位置。 要運行本程序,輸入可執(zhí)行文件的路徑名: 代碼: $ ./newhello Hello, world! 源程序各部分被編譯為單一的可執(zhí)行文件,它與我們先前的例子產(chǎn)生的結(jié)果相同。 鏈接外部庫 庫是預(yù)編譯的目標文件(object files)的集合,它們可被鏈接進程序。靜態(tài)庫以后綴為.a的特殊的存檔文件(archive file)存儲。 標準系統(tǒng)庫可在目錄 /usr/lib 與 /lib 中找到。比如,在類 Unix 系統(tǒng)中 C 語言的數(shù)學(xué)庫一般存儲為文件 /usr/lib/libm.a。該庫中函數(shù)的原型聲明在頭文件 /usr/include/math.h 中。C 標準庫本身存儲為 /usr/lib/libc.a,它包含 ANSI/ISO C 標準指定的函數(shù),比如printf。對每一個 C 程序來說,libc.a 都默認被鏈接。 下面的是一個調(diào)用數(shù)學(xué)庫 libm.a 中 sin 函數(shù)的的例子: 代碼: #include #include int main (void) double x = sin (2.0); printf (The value of sin(2.0) is %fn, x); return 0; 嘗試單獨從該文件生成一個可執(zhí)行文件將導(dǎo)致一個鏈接階段的錯誤: 代碼: $ gcc -Wall calc.c -o calc /tmp/cckDHfI8.o: In function main: calc.c.text+0x1b): undefined reference to sin 函數(shù) sin,未在本程序中定義也不在默認庫libc.a中;除非被指定,編譯器也不會鏈接libm.a。 為使編譯器能將 sin 鏈接進主程序calc.c,我們需要提供數(shù)學(xué)庫libm.a。一個容易想到但比較麻煩的做法是在命令行中顯式地指定它: 代碼: $ gcc -Wall calc.c /usr/lib/libm.a -o calc 函數(shù)庫libm.a包含所有數(shù)學(xué)函數(shù)的目標文件,比如sin,cos,exp,log及sqrt。鏈接器將搜索所有文件來找到包含 sin 的目標文件。 一旦包含 sin 的目標文件被找到,主程序就能被鏈接,一個完整的可執(zhí)行文件就可生成了: 代碼: $ ./calc The value of sin(2.0) is 0.909297 可執(zhí)行文件包含主城許的機器碼以及函數(shù)庫libm.a中 sin 對應(yīng)的機器碼。 為避免在命令行中指定長長的路徑,編譯器為鏈接函數(shù)庫提供了快捷的選項-l。例如,下面的命令 代碼: $ gcc -Wall calc.c -lm -o calc 與我們上面指定庫全路徑/usr/lib/libm.a的命令等價。 一般來說,選項 -lNAME使鏈接器嘗試鏈接系統(tǒng)庫目錄中的函數(shù)庫文件 libNAME.a。一個大型的程序通常要使用很多 -l 選項來指定要鏈接的數(shù)學(xué)庫,圖形庫,網(wǎng)絡(luò)庫等。 編譯C+/Fortran 你可能知道:GCC 是 GNU 編譯器集合(GNU Compiler Collection)的首字母縮寫詞。它可以編譯 C,C+,Objective-C,F(xiàn)ortran,Java 和 Ada 語言。 前面我們只涉及到 C 語言,那么如何用 gcc 編譯其他語言呢? 編譯c+ (下面兩條命令是等價的,不過我相信你會選擇前者_) 代碼: g+ -Wall hello.cpp -o hello gcc -Wall hello.cpp -o hello -lstdc+ 編譯fortran 如果你的gcc版本=4.0,以下命令任選其一即可 代碼: gfortran -Wall hello.f -o hello gcc -Wall hello.f -o hello -lgfortran -lgfortranbegin 如果gcc版本4.0 ,那么以下命令任選其一 代碼: g77 -Wall hello.f -o hello gcc -Wall hello.f -o hello -lfrtbegin -lg2c關(guān)于本機裝的Anjuta Anjuta 只不過是個寫C,C+ 的IDE環(huán)境而已。配備庫文件后,才可以寫程序,包括在終端運行的程序(類似于DOS程序),和圖形界面程序(類似于窗口程序)。 下面就用Anjuta寫一個c,寫一個c+ 應(yīng)用程序編程Anjuta IDE 新建工程,用向?qū)梢粋€C程序的框架,你在Visual C+一樣,頓時生成許多文件,用IDE就是這樣麻煩。 選擇C標簽頁下的Generic 工程名用默認的foobar-sample 在optional下全部選擇:無 生成目的地為:主文件夾:zhouxiongfei 之下新建一個文件夾:test 在Anjuta左邊文件目錄中,打開src文件夾,看到有個main.c,打開它,可以看到向?qū)б呀?jīng)為我們生成了一個c程序: /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * main.c * Copyright (C) 周雄飛 2008 * * main.c is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * main.c is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include int main() printf(Hello worldn); return (0); 按shift+F11生成工程(對應(yīng)于: 生成生成工程) 按F3(對應(yīng)于:run|執(zhí)行程序(需要選擇要運行是那個程序)就可以在終端運行了 寫C方法與上面相同,只是要選擇C標簽下的 Generic C而已。下面接著來,生成C圖形界面的程序 要生成C圖形界面的程序,得安裝GTK環(huán)境 安裝GTK環(huán)境只要安裝一個gnome-core-devel就可以了,里面集成了很多其他的包。除此之外還要轉(zhuǎn)一些其他的東西,如libglib2.0 -doc、libgtk2.0-doc幫助文檔,devhelp幫助文檔查看,glade-gnome、glade-common、glade-doc圖形界面設(shè)計等。 代碼: sudo apt-get install gnome-core-devel sudo apt-get install libglib2.0-doc libgtk2.0-doc sudo apt-get install devhelp sudo apt-get install glade-gnome glade-common glade-doc 寫個測試程序,全是抄別人的,相當于windows下的SDK了。 記事本編寫,終端命令編譯: #include void hello(GtkWidget *widget,gpointer data) g_print(Hello Ubuntu!n); gint delete_event(GtkWidget *widget,GdkEvent *event,gpointer data) g_print (delete event occurredn); return(TRUE); void destroy(GtkWidget *widget,gpointer data) gtk_main_quit(); int main( int argc, char *argv ) GtkWidget *window; GtkWidget *button; gtk_init (&argc, &argv); window=gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_signal_connect (GTK_OBJECT(window),delete_event,GTK_SIGNAL_FUNC(delete_event),NULL); gtk_signal_connect (GTK_OBJECT (window), destroy,GTK_SIGNAL_FUNC (destroy), NULL); gtk_container_set_border_width (GTK_CONTAINER (window), 10); button = gtk_button_new_with_label (Hello Ubuntu!); gtk_signal_connect (GTK_OBJECT (button), clicked,GTK_SIGNAL_FUNC (hello), NULL); gtk_signal_connect_object (GTK_OBJECT (button), clicked,GTK_SIGNAL_FUNC (gtk_widget_destroy),GTK_OBJECT (window); gtk_container_add (GTK_CONTAINER (window), button); gtk_widget_show (button); gtk_widget_show (window); /*顯示一個窗口*/ gtk_main(); /*進入主循環(huán)*/ return(0); 保存為:gtkhello.c 用下面命令編譯運行 代碼: $ gcc gtkhello.c -o gtktest pkg-config -cflags -libs gtk+-2.0 $ ./gtktest 會顯示一個帶有一個按鈕的窗口,點擊按鈕以后窗口關(guān)閉,命令行顯示Hello Ubuntu! 如下圖所示:如果要生成C的圖形界面,得安裝gtkmm,或者QT 配備類似于MFC的環(huán)境 一般有兩種選擇:gtkmm版本,或者是qt版本的圖形類庫 這里講述的是gtkmm版本。 在添加刪除程序里面 搜索gtkmm安裝最新版本把dev包也裝上。搜索gnomemm把libgnomemm也裝上,包含dev包。同樣的還有l(wèi)ibglademm。一定都要包含dev包。 這時你的Ubuntu c+開發(fā)環(huán)境就配置好了,使用:pkg-config cflags gtkmm-2.4; pkg-config cflags libglademm-2.4,驗證是否安裝好了。提示缺少什么就安裝什么。 要命的是,在我這個Ubuntu中的添加刪除中壓根兒就搜索不到gtkmm ! 從網(wǎng)上下載的源碼包:gtkmm-2.8.3.tar.bz2 解壓 啟動終端,轉(zhuǎn)到解壓的目錄下:執(zhí)行終端命令: # ./configure # make # make install (注明,看到 號了嗎?這表明目前是在 root 用戶下,權(quán)限最高,如果是在一般用戶下,即 $ 之下,則需要加上 sudo ,暫時借用一下管理員最高權(quán)限,在執(zhí)行這個命令的時候,呵呵,否則會出錯的啦。即 sudo make install ) 實施源代碼安裝方式。OK 在Anjuta中可以看到它了GTKmm ! 新建一個工程,選擇GTKmm 在選項中只保留:Add share libarry support 為是,其它為否。 自動生成一個窗口程序的所有相關(guān)代碼,生成的時間有點長。 主程序代碼: /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * main.cc * Copyright (C) 周雄飛 2008 * * main.cc is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * main.cc is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * Y
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 供應(yīng)配送水果合同范例
- 兼職公司合同范例
- 免工傷合同范例
- 代理報名合同范例
- 修建宿舍合同范本
- 佛山稅務(wù)咨詢合同范例
- 加工中心加工采購合同范例
- app制作研發(fā)合同范例
- 94勞動合同范例
- 買賣模具開模合同范例
- 2025年江西青年職業(yè)學(xué)院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 初中物理校本教材《物理之窗》內(nèi)容
- 清華大學(xué)考生自述
- 《紅樓夢 - 林黛玉進賈府》PPT課件(教學(xué))
- 【新教材】高中語文超全課內(nèi)知識梳理(選擇性必修中冊)
- 血氣分析臨床基礎(chǔ)(課堂PPT)
- 第三章 文獻的版本
- 等截面雙鉸圓拱內(nèi)力計算
- ABB變頻器培訓(xùn)資料
- 五年級下冊英語課件--Lesson--7《Arriving-in-Beijing-》|冀教版-(三起)-(共21張PPT)
- NBC(一體式)系列氣體保護焊機說明書(凱爾達)
評論
0/150
提交評論