Linux環(huán)境下程序編譯_第1頁
Linux環(huán)境下程序編譯_第2頁
Linux環(huán)境下程序編譯_第3頁
Linux環(huán)境下程序編譯_第4頁
免費預覽已結束,剩余13頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Linux環(huán)境下程序編譯曙光信息產業(yè)(北京)有限公司1提綱1.GCC編譯2.Make簡介2一個簡單的例子—hello.c用vi編寫源文件:#include<stdio.h>voidmain(){

printf(“helloworld.\n”);}用gcc編譯

gcc

hello.c運行a.out3GCC簡介(1/2)gcc(GNUComplilerCollection)是GNU推出的功能強大、性能優(yōu)越的多平臺編譯器,是GNU的代表作品之一。gcc編譯器能將C、Fortran,C++語言源程序、匯程式化序和目標程序編譯、連接成可執(zhí)行文件,如果沒有給出可執(zhí)行文件的名字,gcc將生成一個名為a.out的文件。gcc最基本的用法是∶

gcc[options][filenames]

其中options就是編譯器所需要的參數(shù),filenames給出相關的文件名稱4GCC簡介(2/2)在Linux系統(tǒng)中,可執(zhí)行文件沒有統(tǒng)一的后綴,系統(tǒng)從文件的屬性來區(qū)分可執(zhí)行文件和不可執(zhí)行文件。而gcc則通過后綴來區(qū)別輸入文件的類別.c為后綴的文件,C語言源代碼文件.f為后綴的文件,F(xiàn)ortran77語言源代碼文件.f90為后綴的文件,F(xiàn)ortran90語言源代碼文件.C,.cc或.cxx

為后綴的文件,是C++源代碼文件.h為后綴的文件,是程序所包含的頭文件.o為后綴的文件,是編譯后的目標文件,也是靜態(tài)庫文件.so為后綴的文件,動態(tài)庫文件.a為后綴的文件,是由目標文件構成的檔案庫文件5GCC常用編譯參數(shù)(1/3)-c:只編譯,不連接成為可執(zhí)行文件,編譯器只是由輸入的.c等源代碼文件生成.o為后綴的目標文件,通常用于編譯不包含主程序的子程序文件。-ooutput_filename:確定輸出文件的名稱為output_filename,同時這個名稱不能和源文件同名。如果不給出這個選項,gcc就給出預設的可執(zhí)行文件a.out。-g:產生符號調試工具(GNU的gdb)所必要的符號資訊,要使用gdb對源代碼進行調試,我們就必須加入這個選項。-O:對程序進行優(yōu)化編譯、連接,采用這個選項,整個源代碼會在編譯、連接過程中進行優(yōu)化處理,這樣產生的可執(zhí)行文件的執(zhí)行效率可以提高,但是,編譯、連接的速度就相應地要慢一些。-O2:比-O更好的優(yōu)化編譯、連接,當然整個編譯、連接過程會更慢。6GCC常用編譯參數(shù)(2/3)-Idirname:將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預編譯過程中使用的參數(shù)。C程序中的頭文件包含兩種情況:A)#include<stdio.h>B)#include“myinc.h”

其中,A類使用尖括號(<>),B類使用雙引號(“”)。對于A類,預處理程序cpp在系統(tǒng)預設包含文件目錄(如/usr/include)中搜尋相應的文件,而對于B類,cpp在當前目錄中搜尋頭文件,這個選項的作用是告訴cpp,如果在當前目錄中沒有找到需要的文件,就到指定的dirname目錄中去尋找。在程序設計中,如果我們需要的這種包含文件分別分布在不同的目錄中,就需要逐個使用-I選項給出搜索路徑。7GCC常用編譯參數(shù)(3/3)-Ldirname:將dirname所指出的目錄加入到程序函數(shù)檔案庫文件的目錄列表中,是在連接過程中使用的參數(shù)。在預設狀態(tài)下,連接程序ld在系統(tǒng)的預設路徑中(如/usr/lib)尋找所需要的檔案庫文件,這個選項告訴連接程序,首先到-L指定的目錄中去尋找,然后到系統(tǒng)預設路徑中尋找,如果函數(shù)庫存放在多個目錄下,就需要依次使用這個選項,給出相應的存放目錄。-lname:在連接時,裝載名字為“l(fā)ibname.a”的函數(shù)庫,該函數(shù)庫位于系統(tǒng)預設的目錄或者由-L選項確定的目錄下。例如,-lm表示連接名為“l(fā)ibm.a”的數(shù)學函數(shù)庫。

上面我們簡要介紹了gcc編譯器最常用的功能和主要參數(shù)選項,更為詳盡的資料可以參看Linux系統(tǒng)的聯(lián)機幫助。8GCC應用舉例1.gcc

hello.c

生成a.out2.gcc–ohellohello.c

生成hello3.gcc–O–ohellohello.c

生成hello4.gcc–O2–ohellohello.c

生成hello5.gcc–chello.c

生成hello.o

gcc–ohellohello.o

生成hello6.gcc–chello1.c 生成hello1.o

gcc–chello2.c 生成hello2.o

gcc–ohellohello1.ohello2.o生成hello7.gcc–otesttest.o–lm–I/home/czn/include9Make簡介在開發(fā)大系統(tǒng)時,經常要將程序劃分為許多模塊。各個模塊之間存在著各種各樣的依賴關系,在Linux中通常使用Makefile來管理。由于各個模塊間不可避免存在關聯(lián),所以當一個模塊改動后,其他模塊也許會有所更新,當然對小系統(tǒng)來說,手工編譯連接是沒問題,但是如果是一個大系統(tǒng),存在很多個模塊,那么手工編譯的方法就不適用了。為此,在Linux系統(tǒng)中,專門提供了一個make命令來自動維護目標文件。與手工編譯和連接相比,make命令的優(yōu)點在于他只更新修改過的文件,而對沒修改的文件則置之不理,并且make命令不會漏掉一個需要更新的文件。10一個簡單的例子先舉一個例子:a.c

b.c兩個程序a.c

externvoidp(char*);

main()

{

p("helloworld");

}

b.c

voidp(char*str)

{

printf("%sn",str);

}Makefile

hello:a.cb.c

gcca.cb.c-ohello注意這里是一個Tab執(zhí)行make

gcca.cb.c-ohello

產生一個叫hello的可執(zhí)行程序11書寫makefile文件Makefile時由規(guī)則來組成的,每一條規(guī)則都有三部分組成:目標(object),依賴(dependency)和命令(command).在上面的例子中,Makefile只有一條規(guī)則,其目標為hello,期依賴為a.c

b.c,其命令為gcc

a.c

b.c-ohello.依賴可以是另一條規(guī)則的目標,也可以是文件.每一條規(guī)則被這樣處理.如目標是一個文件是:當它的依賴是文件時,如果依賴的時間比目標要新,則運行規(guī)則所包含的命令來更新目標;如果依賴是另一個目標則用同樣的方法先來處理這個目標.如目標不是一個存在的文件時,則一定執(zhí)行.12一個簡單的makefile文件例如:Makefilehello:a.o

b.o

gcc

a.o

b.o-ohello

a.o:a.c

gcc–ca.c

b.o:b.c

gcc–cb.c當運行make時,可以接一目標名(eg:makehello)作為參數(shù),表示要處理改目標。如沒有參數(shù),則處理第一個目標。對上述例子執(zhí)行make,則是處理hello這個目標。hello依賴于文件目標a.o和b.o,則先去處理a.o,調用gcc–ca.c來更新a.o,之后更新b.o,最后調用gcc

a.c

b.o-ohello來更新hello.13Make中的宏(macro)在make中是用宏,要先定義,然后在makefile中引用。宏的定義格式為:宏名=宏的值(宏名一般習慣用大寫字母)例:

CC=gcchello:a.o

b.o

$(CC)a.o

b.o-ohello

a.o:a.c

$(CC)–ca.c

b.o:b.c

$(CC)–cb.c14系統(tǒng)定義的宏還有一些設定好的內部變量,它們根據(jù)每一個規(guī)則內容定義。$@當前規(guī)則的目的文件名$<依靠列表中的第一個依靠文件$^整個依靠的列表(除掉了里面所有重復的文件名)。$?依賴中所有新于目標的以用變量做許多其它的事情,特別是當你把它們和函數(shù)混合使用的時候。如果需要更進一步的了解,請參考GNUMake手冊。('manmake','manmakefile')15修改原先的makefileCC=gccCFLAGS=-O2OBJS=a.o

b.o

hello:$(OBJS) $(CC)$^-o$@a.o:a.c $(CC)$(CFLAGS

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論