版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
能力要求了解開放源碼軟件的安裝與升級。掌握使用傳統(tǒng)程序語言進(jìn)行編譯的方法。掌握用make進(jìn)行編譯的方法和技能。掌握使用Tarball管理包。掌握RPM安裝、查詢、移除軟件的方法。學(xué)會使用yum安裝與升級軟件。在項(xiàng)目1中提到過GNU計(jì)劃與GPL授權(quán)所產(chǎn)生的自由軟件與開放源碼。不過,前面的項(xiàng)目都還沒有提到真正的開放源碼到底是什么。在本項(xiàng)目中,通過Linux操作系統(tǒng)的運(yùn)行文件理解什么是可運(yùn)行的程序以及什么是編譯器。另外,讀者還將學(xué)習(xí)到與程序相關(guān)的函數(shù)庫(library)的知識。總之,本項(xiàng)目可以讓讀者了解如何將開放源碼的程序鏈接到函數(shù)庫,通過編譯而成為可以運(yùn)行的二進(jìn)制程序(二進(jìn)制程序)的一系列過程。本項(xiàng)目重點(diǎn)介紹最基本的軟件管理方式:使用Tarball來安裝與升級軟件。1項(xiàng)目實(shí)錄:安裝和管理軟件包內(nèi)容導(dǎo)航項(xiàng)目知識準(zhǔn)備3項(xiàng)目實(shí)施2一、項(xiàng)目知識準(zhǔn)備——開放源碼、編譯器與可執(zhí)行文件Linux的軟件都是經(jīng)過GPL授權(quán)的,所以每個(gè)軟件均提供原始程序代碼,并且可以自行修改該程序源碼,以符合個(gè)人的需求。這就是開放源碼的優(yōu)點(diǎn)。不過,到底什么是開放源碼?這些程序代碼到底是什么?Linux上面可以運(yùn)行的相關(guān)軟件文件與開放源碼之間是如何轉(zhuǎn)換的?不同版本的Linux之間能不能使用同一個(gè)運(yùn)行文件?或者該運(yùn)行文件需要由原始程序代碼的部分重新進(jìn)行轉(zhuǎn)換嗎?本項(xiàng)目將回答這些問題。一、項(xiàng)目知識準(zhǔn)備——開放源碼、編譯器與可執(zhí)行文件在討論程序代碼是什么之前,先來了解一下什么是可執(zhí)行文件。在Linux系統(tǒng)中,一個(gè)文件能不能被運(yùn)行在于有沒有可運(yùn)行的權(quán)限(具有xpermission),不過,Linux系統(tǒng)中的可執(zhí)行文件其實(shí)是二進(jìn)制文件(二進(jìn)制程序),例如/usr/bin/passwd、/bin/touch這些文件即為二進(jìn)制程序代碼。shellscript不是可執(zhí)行文件。shellscript只是利用shell(例如bash)這個(gè)程序的功能進(jìn)行一些判斷,而最終運(yùn)行的除了bash提供的功能外,仍是調(diào)用一些已經(jīng)編譯好的二進(jìn)制程序。當(dāng)然,bash本身也是一個(gè)二進(jìn)制程序。一、項(xiàng)目知識準(zhǔn)備——開放源碼、編譯器與可執(zhí)行文件使用file命令能夠測試一個(gè)文件是否為binary文件。#先以系統(tǒng)的文件測試看看:[root@Server01~]#file/bin/bash/bin/bash:ELF32-bitLSBexecutable,Intel80386,version1(SYSV),forGNU/Linux2.6.9,dynamicallylinked(usessharedlibs),forGNU/Linux2.6.9,stripped#如果是系統(tǒng)提供的/etc/init.d/syslog呢?[root@Server01~]#file/etc/init.d/syslog/etc/init.d/syslog:Bourne-Againshellscripttextexecutable一、項(xiàng)目知識準(zhǔn)備——開放源碼、編譯器與可執(zhí)行文件既然Linux操作系統(tǒng)真正識別的是二進(jìn)制程序,那么該如何制作binary程序呢?●首先使用vim來進(jìn)行原始程序代碼的編寫。●完成這個(gè)源碼文件的編寫之后,將這個(gè)文件“編譯”成為操作系統(tǒng)看得懂的二進(jìn)制程序。例如:在Linux上面最標(biāo)準(zhǔn)的程序語言為C,所以使用C的語法進(jìn)行原始程序代碼的編寫,寫完之后,用Linux上標(biāo)準(zhǔn)的C語言編譯器gcc來編譯,就可以制作一個(gè)可以運(yùn)行的二進(jìn)制程序。開放源碼、編譯器、可執(zhí)行文件可以總結(jié)如下:●開放源碼:就是程序代碼,寫給人類看的程序語言,但機(jī)器并不認(rèn)識,所以無法運(yùn)行?!窬幾g器:將程序代碼編譯成為機(jī)器看得懂的語言,就類似翻譯者的角色。●可執(zhí)行文件:經(jīng)過編譯器變成二進(jìn)制程序后,機(jī)器看得懂可以直接運(yùn)行的文件。一、項(xiàng)目知識準(zhǔn)備——make與configure使用類似gcc的編譯器來進(jìn)行編譯的過程并不簡單,因?yàn)橐惶总浖⒉粫H有一個(gè)程序,而是有很多程序代碼文件。所以每個(gè)主程序與副程序除了均需要寫上編譯過程的命令外,還需要寫上最終的鏈接程序。如果程序代碼少還好,但是類似WWW服務(wù)器軟件(例如Apache),或者是類似核心的源碼,動(dòng)輒數(shù)百M(fèi)B的數(shù)據(jù)量,編譯命令將很大。這個(gè)時(shí)候,可以使用make命令的相關(guān)功能來進(jìn)行編譯過程的命令簡化。當(dāng)運(yùn)行make時(shí),make會在當(dāng)前的目錄下搜尋Makefile(或makefile)文件,而Makefile里面記錄了源碼如何編譯的詳細(xì)信息。make會自動(dòng)地判別源碼是否已經(jīng)改變,而自動(dòng)升級執(zhí)行文件,所以,make是軟件工程師相當(dāng)好用的一個(gè)輔助工具。一、項(xiàng)目知識準(zhǔn)備——make與configuremake是一個(gè)程序,會去找Makefile,那么Makefile怎么撰寫呢?通常軟件開發(fā)商都會寫一個(gè)檢測程序來檢測使用者的操作環(huán)境以及該操作環(huán)境是否有軟件開發(fā)商所需要的其他功能,該檢測程序檢測完畢后,就會主動(dòng)地創(chuàng)建Makefile的規(guī)則文件。通常檢測程序的文件名為configure或者是config。要檢測操作環(huán)境是因?yàn)椴煌姹镜暮诵乃褂玫南到y(tǒng)調(diào)用可能不相同,而且每個(gè)軟件所需要的相關(guān)的函數(shù)庫也不相同。同時(shí),軟件開發(fā)商不會僅針對Linux開發(fā),而是會針對整個(gè)Unix-Like開發(fā)。所以也必須要檢測該操作系統(tǒng)平臺有沒有提供合適的編譯器才行。一般來說,檢測程序會檢測的數(shù)據(jù)如下:一、項(xiàng)目知識準(zhǔn)備——make與configure●是否有適合的編譯器可以編譯本軟件的程序代碼?!袷欠褚呀?jīng)存在本軟件所需要的函數(shù)庫,或其他需要的相關(guān)軟件?!癫僮飨到y(tǒng)平臺是否適合本軟件,包括Linux的核心版本?!駜?nèi)核的頭定義文件(headerinclude)是否存在(驅(qū)動(dòng)程序必須要的檢測)。由于不同的Linuxdistribution的函數(shù)庫文件的路徑、函數(shù)庫的文件名定義、默認(rèn)安裝的編譯器以及內(nèi)核的版本都有可能不相同,因此理論上,無法在CentOS5.x上面編譯出二進(jìn)制程序后,還將它拿到SuSE上面運(yùn)行。因?yàn)檎{(diào)用的目標(biāo)函數(shù)庫位置可能不同,內(nèi)核版本更不可能相同。所以能夠運(yùn)行的情況微乎其微。同一套軟件要在不同的平臺上面運(yùn)行時(shí),必須要重復(fù)編譯。一、項(xiàng)目知識準(zhǔn)備——DPKG與RPM目前在Linux中安裝軟件最常見的有兩種方式,分別是dpkg和RPM。●DPKG這個(gè)機(jī)制最早是由DebianLinux社群開發(fā)出來的,通過DPKG的機(jī)制,Debian提供的軟件就能夠簡單地安裝,同時(shí)還能提供安裝后的軟件信息。凡是衍生于Debian的其他Linuxdistributions大多使用DPKG機(jī)制來管理軟件,包括B2D、Ubuntu等?!馬PM這個(gè)機(jī)制最早是由RedHat公司開發(fā)出來的。后來由于軟件很好用,很多distributions就使用這個(gè)機(jī)制來作為軟件安裝的管理方式。包括Fedora、CentOS、SuSE等知名的開發(fā)商都用RPM。一、項(xiàng)目知識準(zhǔn)備——DPKG與RPMDPKG/RPM機(jī)制會有軟件依賴性的問題。每個(gè)軟件文件都提供軟件依賴性的檢查。如果將依賴屬性的數(shù)據(jù)做成列表,等到實(shí)際軟件安裝時(shí),若發(fā)現(xiàn)有依賴屬性的軟件時(shí),例如安裝A需要先安裝B與C,而安裝B則需要安裝D與E,那么當(dāng)安裝A時(shí),通過依賴屬性列表,管理機(jī)制自動(dòng)去取得B、C、D、E來同時(shí)安裝,就解決了軟件依賴性的問題。目前新的Linux開發(fā)商都提供這樣的“線上升級”機(jī)制,通過這個(gè)機(jī)制,原版光盤只有第一次安裝時(shí)用到,其他時(shí)候只要有網(wǎng)絡(luò),就能夠取得開發(fā)商所提供的任何軟件了。在dpkg管理機(jī)制上開發(fā)出了APT線上升級機(jī)制,RPM則依開發(fā)商的不同,有RedHat系統(tǒng)的yum,SuSE系統(tǒng)的YastOnlineUpdate(YOU),Mandriva的urpmi軟件等。線上升級如表7-1所示。一、項(xiàng)目知識準(zhǔn)備——DPKG與RPM表7-1各發(fā)行版本的線上升級RHEL6使用的軟件管理機(jī)制為RPM機(jī)制,而用來作為線上升級的方式則為yum。distribution代表軟件管理機(jī)制使用命令線上升級機(jī)制(命令)RedHat/FedoraRPMrpm,rpmbuildYUM(yum)Debian/UbuntuDPKGdpkgAPT(apt-get)一、項(xiàng)目知識準(zhǔn)備——i386,i586,i686,x86_64,noarch從上面的說明看,RPM與SRPM的格式分別為:xxxxxxxxx.rpm<==RPM的格式,已經(jīng)經(jīng)過編譯且包裝完成的rpm文件xxxxx.src.rpm<==SRPM的格式,包含未編譯的源碼信息只要通過文件名就可以知道這個(gè)軟件的版本、適用平臺、編譯發(fā)布的次數(shù)。例如:rp-pppoe-3.1-5.i386.rpm的文件的意義為:rp-pppoe-3.1-5.i386.rpm軟件名稱軟件的版本信息發(fā)布的次數(shù)操作硬件平臺擴(kuò)展名一、項(xiàng)目知識準(zhǔn)備——i386,i586,i686,x86_64,noarch除了后面適合的硬件平臺與擴(kuò)展名外,以“-”來隔開各個(gè)部分,這樣可以很清楚地找到該軟件名稱、版本信息、發(fā)布版本次數(shù)與操作硬件平臺?!褴浖Q:是每一個(gè)軟件的名稱。上面范例的名稱是rp-pppoe?!癜姹拘畔ⅲ好看紊壈姹拘枰幸粋€(gè)版本的信息,否則無法知道這一版是新是舊。通常又分為主版本和次版本。以上面為例,主版本為3,在主版本的架構(gòu)下改動(dòng)部分源碼內(nèi)容,成為一個(gè)新的版本,就是次版本。以上面為例,就是1。一、項(xiàng)目知識準(zhǔn)備——i386,i586,i686,x86_64,noarch●發(fā)布版本次數(shù):通常是編譯的次數(shù)。重復(fù)地編譯是由于同一版的軟件中,可能由于有某些bug或者是安全上的顧慮,所以必須要進(jìn)行小幅度的更新(patch)或重設(shè)一些編譯參數(shù)。配置完成之后重新編譯并打包成RPM文件。●操作硬件平臺:由于RPM可以適用在不同的操作平臺上,但是不同的平臺配置的參數(shù)還是有所差異的。并且,可以針對比較高階的CPU來進(jìn)行最佳化參數(shù)的配置,這樣才能夠使用高階CPU所帶來的硬件加速功能。所以就出現(xiàn)了i386、i586、i686、x86_64與noarch等的文件名稱。如表7-3所示。一、項(xiàng)目知識準(zhǔn)備——i386,i586,i686,x86_64,noarch平臺名稱適合平臺說明i386幾乎適用于所有的x86平臺,不論是舊的pentum或者是新的IntelCore2與K8系列的CPU等,都可以正常地工作。“i”指的是Intel兼容CPU的意思,386就是CPU的等級i586針對586等級計(jì)算機(jī)進(jìn)行最佳化編譯。包括pentum第一代MMXCPU、AMD的K5、K6系列CPU(socket7插腳)等的CPUi686在pentumⅡ以后的Intel系列CPU及K7以后等級的CPU都屬于i686等級。由于目前市面上幾乎僅剩pentumⅡ以后等級的硬件平臺,因此很多distribution都直接出這種等級的RPM文件x86_64針對64位的CPU進(jìn)行最佳化編譯配置,包括Intel的Core2以上等級CPU以及AMD的Athlon64以后等級的CPU,都屬于這一類型的硬件平臺noarch就是沒有任何硬件等級上的限制。一般來說,這種類型的RPM文件里面應(yīng)該沒有binaryprogram存在,較常出現(xiàn)的就是屬于shellscript方面的軟件一、項(xiàng)目知識準(zhǔn)備——i386,i586,i686,x86_64,noarch受益于目前x86系統(tǒng)的支持,新型CPU都能夠運(yùn)行舊型CPU所支持的軟件,即硬件方面都可以向下兼容,因此最低等級的i386軟件可以安裝在所有的x86硬件平臺上面,不論是32位還是64位。但是反過來就不行了。舉例來說,目前硬件大多是64位的等級,因此可以在該硬件上面安裝x86_64或i386等級的RPM軟件。但在舊型主機(jī),例如pentum-III/pentum-432位機(jī)器上面,不能夠安裝x86_64的軟件。根據(jù)上面的說明,選擇i386版本安裝在x86硬件上面是可以的。但是如果強(qiáng)調(diào)性能的話,還是應(yīng)該選擇與硬件相匹配的RPM文件,因?yàn)樵撥浖槍PU硬件平臺進(jìn)行過參數(shù)最優(yōu)化的編譯。一、項(xiàng)目知識準(zhǔn)備——RPM屬性依賴的解決方法:YUM線上升級為了重復(fù)利用既有的軟件功能,很多軟件都會以函數(shù)庫的方式發(fā)布部分功能,以方便其他軟件的調(diào)用。例如,PAM模塊的驗(yàn)證功能。此外,為了節(jié)省用戶的數(shù)據(jù)量,目前的distributions在發(fā)布軟件時(shí)都會將軟件的內(nèi)容分為一般使用與開發(fā)使用(development)兩大類。所以常??吹接蓄愃苝am-x.x.rpm與pam-devel-x.x.rpm之類的文件名。而默認(rèn)情況下,大部分的software-devel-x.x.rpm都不必安裝,因?yàn)榻K端用戶大部分不去做開發(fā)軟件的工作。因此,RPM軟件文件就會有所謂的屬性依賴的問題產(chǎn)生(其實(shí)所有的軟件管理幾乎都有這方面的情況存在)。那有沒有辦法解決呢?前面不是談到RPM軟件文件內(nèi)部會記錄依賴屬性的數(shù)據(jù)嗎?那想一想,要是將這些依賴屬性的軟件先列表,在需要安裝軟件的時(shí)候,先到這個(gè)列表中查找,同時(shí)與系統(tǒng)內(nèi)已安裝的軟件相比較,沒安裝到的依賴軟件就會自動(dòng)同時(shí)安裝,那不就解決了依賴屬性的問題了嗎?有沒有這種機(jī)制呢?當(dāng)然有!那就是YUM機(jī)制。一、項(xiàng)目知識準(zhǔn)備——RPM屬性依賴的解決方法:YUM線上升級RHEL先將發(fā)布的軟件存放到Y(jié)UM服務(wù)器內(nèi),然后分析這些軟件的依賴屬性問題,將軟件內(nèi)的記錄信息寫下來(header)。然后再將這些信息分析后記錄成軟件相關(guān)性的清單列表。這些列表數(shù)據(jù)與軟件所在的位置叫容器(repository)。當(dāng)用戶端有軟件安裝的需求時(shí),用戶端主機(jī)會主動(dòng)地向網(wǎng)絡(luò)上面的YUM服務(wù)器的容器網(wǎng)址下載清單列表,然后通過清單列表的數(shù)據(jù)與本機(jī)RPM數(shù)據(jù)庫已存在的軟件數(shù)據(jù)相比較,就能夠安裝所有需要的具有依賴屬性的軟件。內(nèi)容導(dǎo)航1項(xiàng)目實(shí)錄:安裝和管理軟件包項(xiàng)目知識準(zhǔn)備3項(xiàng)目實(shí)施2二、項(xiàng)目實(shí)施——任務(wù)7-1安裝gcc1.認(rèn)識gccgcc(GNUCompilerCollection,GNU編譯器集合),是一套由GNU開發(fā)的編程語言編譯器。它是一套GNU編譯器套裝,是以GPL許可證所發(fā)行的自由軟件,也是GNU計(jì)劃的關(guān)鍵部分。gcc原來作為GNU操作系統(tǒng)的官方編譯器,現(xiàn)已被大多數(shù)類UNIX操作系統(tǒng)(如Linux、BSD、MacOSX等)采納為標(biāo)準(zhǔn)的編譯器,gcc同樣適用于微軟的Windows。gcc是自由軟件過程發(fā)展中的著名例子,由自由軟件基金會以GPL協(xié)議發(fā)布。gcc原名為GNUC語言編譯器(GNUCCompiler),因?yàn)樗瓉碇荒芴幚鞢語言。但后來得到擴(kuò)展,可以處理C++,又可以處理Fortran、Pascal、Objective-C、Java和Ada等語言。二、項(xiàng)目實(shí)施——任務(wù)7-1安裝gcc2.安裝gcc(1)檢查是否安裝gcc。[root@Server01~]#rpm-qa|grepgcclibgcc-8.3.1-5.el8.x86_64上述結(jié)果表示未安裝gcc。二、項(xiàng)目實(shí)施——任務(wù)7-1安裝gcc(2)如果系統(tǒng)還沒有安裝gcc軟件包,可以使用dnf命令安裝所需軟件包。①掛載ISO安裝映像://掛載光盤到/media下,前面項(xiàng)目1已建立yum源
[root@Server01~]#mount/dev/cdrom/media②制作用于安裝的yum源文件:[root@Server01~]#vim/etc/yum.repos.d/dvd.repo[Media]name=Meidabaseurl=file:///media/BaseOSgpgcheck=0enabled=1[rhel8-AppStream]name=rhel8-AppStreambaseurl=file:///media/AppStreamgpgcheck=0enabled=1二、項(xiàng)目實(shí)施——任務(wù)7-1安裝gcc③使用dnf命令查看gcc軟件包的信息,如圖9-1所示。
[root@Server01~]#dnfinfogcc二、項(xiàng)目實(shí)施——任務(wù)7-1安裝gcc④使用dnf命令安裝gcc。[root@Server01~]#dnfcleanall //安裝前先清除緩存[root@Server01~]#dnfinstallgcc-y所有軟件包安裝完畢,可以使用rpm命令再一次進(jìn)行查詢:rpm-qa|grepgcc。[root@Server01~]#rpm-qa|grepgcclibgcc-8.3.1-5.el8.x86_64gcc-8.3.1-5.el8.x86_64二、項(xiàng)目實(shí)施——任務(wù)7-2單一程序:打印HelloWorld1.編輯程序代碼即源碼[root@Server01~]#vimhello.c<==用C語言寫的程序擴(kuò)展名建議用.c#include<stdio.h>intmain(void){printf("HelloWorld\n");}第一行的那個(gè)“#”并不是注解。二、項(xiàng)目實(shí)施——任務(wù)7-2單一程序:打印HelloWorld2.開始編譯與測試運(yùn)行[root@Server01~]#gcchello.c[root@Server01~]#llhello.ca.out-rwxr-xr-x.1rootroot8512Jul1521:18a.out <==此時(shí)會生成這個(gè)文件名-rw-r--r--.1rootroot72Jul1521:17hello.c[root@Server01~]#./a.outHelloWorld <==運(yùn)行結(jié)果如果直接以gcc編譯源碼,并且沒有加上任何參數(shù),則執(zhí)行文件的文件名會被自動(dòng)設(shè)置為a.out這個(gè)文件名,就能夠直接執(zhí)行./a.out這個(gè)執(zhí)行文件。即:hello.c就是源碼,而gcc就是編譯器,至于a.out就是編譯成功的可執(zhí)行文件。二、項(xiàng)目實(shí)施——任務(wù)7-2單一程序:打印HelloWorld如果想要生成目標(biāo)文件(objectfile)來進(jìn)行其他的操作,而且執(zhí)行文件的文件名也不要用默認(rèn)的a.out,那該如何做呢?修改編譯與測試:[root@Server01~]#gcc-chello.c[root@Server01~]#llhello*-rw-r--r--.1rootroot72Jul1521:17hello.c-rw-r--r--.1rootroot1496Jul1521:20hello.o<==這就是生成的目標(biāo)文件[root@Server01~]#gcc-ohellohello.o <==小寫字母o![root@Server01~]#llhello*-rwxr-xr-x.1rootroot8512Jul1521:20hello<==這就是可執(zhí)行文件(-o的結(jié)果)-rw-r--r--.1rootroot72Jul1521:17hello.c-rw-r--r--.1rootroot1496Jul1521:20hello.o[root@Server01~]#./helloHelloWorld通過這個(gè)操作,可以得到hello及hello.o兩個(gè)文件,真正可以執(zhí)行的是hello這個(gè)二進(jìn)制文件(binaryprogram)。二、項(xiàng)目實(shí)施——任務(wù)7-3主程序、子程序鏈接、子程序的編譯例子,以thanks.c這個(gè)主程序去調(diào)用thanks_2.c這個(gè)子程序:1.撰寫所需要的主程序、子程序[root@Server01~]#vimthanks.c#include<stdio.h>intmain(void){printf("HelloWorld\n");thanks_2();}上面的thanks_2()就是調(diào)用子程序![root@Server01~]#vimthanks_2.c#include<stdio.h>voidthanks_2(void){printf("Thankyou!\n");}二、項(xiàng)目實(shí)施——任務(wù)7-3主程序、子程序鏈接、子程序的編譯例子,以thanks.c這個(gè)主程序去調(diào)用thanks_2.c這個(gè)子程序:2.進(jìn)行程序的編譯與鏈接(Link)(1)開始將源碼編譯成為可執(zhí)行的binaryfile(警告信息可忽略)。[root@Server01~]#gcc-cthanks.cthanks_2.c[root@Server01~]#llthanks*-rw-r--r--.1rootroot76Jul1521:27thanks_2.c-rw-r--r--.1rootroot1504Jul1521:27thanks_2.o<==編譯生成的目標(biāo)文件!-rw-r--r--.1rootroot91Jul1521:25thanks.c-rw-r--r--.1rootroot1560Jul1521:27thanks.o <==編譯生成的目標(biāo)文件![root@Server01~]#gcc-othanksthanks.othanks_2.o <==小寫字母o![root@Server01~]#llthanks*-rwxr-xr-x.1rootroot8584Jul1521:28thanks<==最終結(jié)果會生成可執(zhí)行文件(2)執(zhí)行可執(zhí)行文件。[root@Server01~]#./thanksHelloWorldThankyou!二、項(xiàng)目實(shí)施——任務(wù)7-4調(diào)用外部函數(shù)庫:加入鏈接的函數(shù)庫例如,我們想要計(jì)算出三角函數(shù)里面的sin90°,代碼如下:[root@Server01~]#vimsin.c#include<stdio.h>#include<math.h>intmain(void){floatvalue;value=sin(3.14/2);printf("%f\n",value);}[root@Server01~]#gccsin.c-lm-L/lib-L/usr/lib<==重點(diǎn)在-lm1.000000[root@Server01~]#./a.out <==嘗試執(zhí)行新文件二、項(xiàng)目實(shí)施——任務(wù)7-4調(diào)用外部函數(shù)庫:加入鏈接的函數(shù)庫特別注意,使用gcc編譯時(shí)所加入的那個(gè)-lm是有意義的,可以拆成兩部分來分析。-l:是加入某個(gè)函數(shù)庫(library)的意思。-m:是libm.so函數(shù)庫,其中,lib與擴(kuò)展名(.a或.so)不需要寫。所以-lm表示使用libm.so(或libm.a)這個(gè)函數(shù)庫的意思。那-L后面接的路徑呢?這表示程序需要的函數(shù)庫libm.so請到/lib或/usr/lib里面尋找。二、項(xiàng)目實(shí)施——任務(wù)7-5gcc的簡易用法(編譯、參數(shù)與鏈接)(1)僅將原始碼編譯成為目標(biāo)文件,并不制作鏈接等功能。[root@Server01~]#gcc-chello.c上述程序會自動(dòng)生成hello.o文件,但是并不會生成二進(jìn)制可執(zhí)行文件。(2)在編譯的時(shí)候,依據(jù)作業(yè)環(huán)境給予執(zhí)行速度優(yōu)化。[root@Server01~]#gcc-Ohello.c-c上述程序會自動(dòng)生成hello.o文件,并且進(jìn)行優(yōu)化。二、項(xiàng)目實(shí)施——任務(wù)7-5gcc的簡易用法(編譯、參數(shù)與鏈接)(3)在進(jìn)行二進(jìn)制可執(zhí)行文件制作時(shí),將鏈接的函數(shù)庫與相關(guān)的路徑填入。[root@Server01~]#gccsin.c-lm-L/usr/lib-I/usr/include在最終鏈接成二進(jìn)制可執(zhí)行文件的時(shí)候,這個(gè)命令較常執(zhí)行。-lm指的是libm.so或libm.a函數(shù)庫文件。-L后面接的路徑是剛剛上面那個(gè)函數(shù)庫的搜索目錄。-I后面接的是源碼內(nèi)的include文件所在的目錄。二、項(xiàng)目實(shí)施——任務(wù)7-5gcc的簡易用法(編譯、參數(shù)與鏈接)(4)將編譯的結(jié)果生成某個(gè)特定文件。[root@Server01~]#gcc-ohellohello.c程序中,-o后面接的是要輸出的二進(jìn)制可執(zhí)行文件名。(5)在編譯的時(shí)候,輸出較多的信息說明。[root@Server01~]#gcc-ohellohello.c-Wall加入-Wall之后,程序的編譯會變得較為嚴(yán)謹(jǐn)一點(diǎn),所以警告信息也會顯示出來。二、項(xiàng)目實(shí)施——任務(wù)7-6使用make進(jìn)行宏編譯1.為什么要用make先來想象一個(gè)案例,假設(shè)執(zhí)行文件里面包含了4個(gè)源碼文件,分別是main.c、haha.c、sin_value.c和cos_value.c,這4個(gè)文件的功能如下。main.c:主要目的是讓用戶輸入角度數(shù)據(jù)與調(diào)用其他3個(gè)子程序。haha.c:輸出一堆信息。sin_value.c:計(jì)算用戶輸入的角度(360)正弦數(shù)值。cos_value.c:計(jì)算用戶輸入的角度(360)余弦數(shù)值。二、項(xiàng)目實(shí)施——任務(wù)7-6使用make進(jìn)行宏編譯main.c:主要目的是讓用戶輸入角度數(shù)據(jù)與調(diào)用其他3個(gè)子程序。[root@Server01~]#mkdir/c[root@Server01~]#cd/c[root@Server01c]#vimmain.c#include<stdio.h>#definepi3.14159charname[15];floatangle;intmain(void){ printf("\n\nPleaseinputyourname:"); scanf("%s",&name); printf("\nPleaseenterthedegreeangle(ex>90):"); scanf("%f",&angle); haha(name); sin_value(angle); cos_value(angle);}二、項(xiàng)目實(shí)施——任務(wù)7-6使用make進(jìn)行宏編譯haha.c:輸出一堆信息。[root@Server01c]#vimhaha.c#include<stdio.h>inthaha(charname[15]){ printf("\n\nHi,Dear%s,nicetomeetyou.",name);}二、項(xiàng)目實(shí)施——任務(wù)7-6使用make進(jìn)行宏編譯sin_value.c:計(jì)算用戶輸入的角度(360)正弦數(shù)值[root@Server01c]#vimsin_value.c#include<stdio.h>#include<math.h>#definepi3.14159floatangle;voidsin_value(void){ floatvalue; value=sin(angle/180.*pi); printf("\nTheSinis:%5.2f\n",value);}二、項(xiàng)目實(shí)施——任務(wù)7-6使用make進(jìn)行宏編譯cos_value.c:計(jì)算用戶輸入的角度(360)余弦數(shù)值[root@Server01c]#vimcos_value.c#include<stdio.h>#include<math.h>#definepi3.14159floatangle;voidcos_value(void){ floatvalue; value=cos(angle/180.*pi); printf("TheCosis:%5.2f\n",value);}二、項(xiàng)目實(shí)施——任務(wù)7-6使用make進(jìn)行宏編譯由于這4個(gè)文件包含了相關(guān)性,并且還用到數(shù)學(xué)函數(shù)式,所以如果想要讓這個(gè)程序可以運(yùn)行,那么就需要進(jìn)行編譯。①先進(jìn)行目標(biāo)文件的編譯,最終會有4個(gè)*.o的文件名出現(xiàn)。[root@Server01c]#gcc-cmain.c[root@Server01c]#gcc-chaha.c[root@Server01c]#gcc-csin_value.c[root@Server01c]#gcc-ccos_value.c二、項(xiàng)目實(shí)施——任務(wù)7-6使用make進(jìn)行宏編譯②再鏈接形成可執(zhí)行文件main,并加入libm的數(shù)學(xué)函數(shù)(\是命令換行符,按回車鍵后在下行繼續(xù)輸入未輸入完成的命令即可)。[root@Server01c]#gcc-omainmain.ohaha.osin_value.ocos_value.o\-lm-L/usr/lib-L/lib③本程序的運(yùn)行結(jié)果,必須輸入姓名、360度角的角度值來完成計(jì)算。[root@Server01c]#./mainPleaseinputyourname:Bobby<==這里先輸入名字Pleaseenterthedegreeangle(ex>90):30<==輸入以360度為主的角度Hi,DearBobby,nicetomeetyou.<==這三行為輸出的結(jié)果TheSinis:0.50TheCosis:0.87二、項(xiàng)目實(shí)施——任務(wù)7-6使用make進(jìn)行宏編譯利用make這個(gè)工具,一個(gè)步驟就全部完成上面所有的操作①先編輯makefile這個(gè)規(guī)則文件,內(nèi)容是制作出main這個(gè)可執(zhí)行文件[root@Server01c]#vimmakefilemain:main.ohaha.osin_value.ocos_value.o gcc-omainmain.ohaha.osin_value.ocos_value.o-lm特別注意:第二行的gcc之前是按“Tab”鍵產(chǎn)生的空格,不是真正空格,否則會出錯(cuò)!二、項(xiàng)目實(shí)施——任務(wù)7-6使用make進(jìn)行宏編譯利用make這個(gè)工具,一個(gè)步驟就全部完成上面所有的操作②使用makefile制訂的規(guī)則進(jìn)行編譯[root@Server01c]#rm-fmain*.o<==先將之前的目標(biāo)文件刪除[root@Server01c]#makecc-c-omain.omain.ccc-c-ohaha.ohaha.ccc-c-osin_value.osin_value.ccc-c-ocos_value.ocos_value.cgcc-omainmain.ohaha.osin_value.ocos_value.o-lm③在不刪除任何文件的情況下,重新運(yùn)行一次編譯的動(dòng)作[root@Server01c]#makemake:“main”已是最新。[root@Server01c]#./mainPleaseinputyourname:yyPleaseenterthedegreeangle(ex>90):60Hi,Dearyy,nicetomeetyou.TheSinis:0.87TheCosis:0.50二、項(xiàng)目實(shí)施——任務(wù)7-6使用make進(jìn)行宏編譯2.了解makefile的基本語法與變量make的語法相當(dāng)多且復(fù)雜,這里僅列出一些基本的守則,基本的makefile守則如下:目標(biāo)(target):目標(biāo)文件1目標(biāo)文件2<tab>gcc-o欲創(chuàng)建的可執(zhí)行文件目標(biāo)文件1目標(biāo)文件2目標(biāo)(target)就是我們想要?jiǎng)?chuàng)建的信息,而目標(biāo)文件就是具有相關(guān)性的objectfiles。語法規(guī)則如下:在makefile當(dāng)中的#代表注解。需要在命令行(例如gcc這個(gè)編譯器命令)的第一個(gè)字節(jié)按“Tab”鍵。目標(biāo)(target)與相關(guān)文件(就是目標(biāo)文件)之間需以“:”隔開。二、項(xiàng)目實(shí)施——任務(wù)7-6使用make進(jìn)行宏編譯上一個(gè)小節(jié)的范例做進(jìn)一步說明,如果想要有兩個(gè)以上的執(zhí)行操作,例如執(zhí)行一個(gè)命令就直接清除掉所有的目標(biāo)文件與可執(zhí)行文件,那該如何制作makefile文件呢?(1)先編輯makefile來建立新的規(guī)則,此規(guī)則的目標(biāo)名稱為clean。[root@Server01c]#vimmakefilemain:main.ohaha.osin_value.ocos_value.ogcc-omainmain.ohaha.osin_value.ocos_value.o-lmclean: rm-fmainmain.ohaha.osin_value.ocos_value.o特別注意:第2行和第4行開頭是按“Tab”鍵產(chǎn)生的空格,不是真正空格,否則會出錯(cuò)!二、項(xiàng)目實(shí)施——任務(wù)7-6使用make進(jìn)行宏編譯而如果想要先清除目標(biāo)文件再編譯main這個(gè)程序,就可以這樣輸入:“makecleanmain”,如下所示:[root@Server01c]#makecleanmainrm-rfmainmain.ohaha.osin_value.ocos_value.occ-c-omain.omain.ccc-c-ohaha.ohaha.ccc-c-osin_value.osin_value.ccc-c-ocos_value.ocos_value.cgcc-omainmain.ohaha.osin_value.ocos_value.o-lm二、項(xiàng)目實(shí)施——任務(wù)7-6使用make進(jìn)行宏編譯makefile里面重復(fù)的數(shù)據(jù)還是有點(diǎn)多。我們可以再通過shellscript的“變量”來簡化makefile:[root@Server01c]#vimmakefileLIBS=-lmOBJS=main.ohaha.osin_value.ocos_value.omain:${OBJS} gcc-omain${OBJS}${LIBS}clean: rm-fmain${OBJS}特別注意:第4行和第6行開頭是按“Tab”鍵產(chǎn)生的空格,不是真正空格,否則會出錯(cuò)!二、項(xiàng)目實(shí)施——任務(wù)7-6使用make進(jìn)行宏編譯變量的基本語法如下:變量與變量內(nèi)容以“=”隔開,同時(shí)兩邊可以有空格。變量左邊不可以按“Tab”鍵,例如上面范例的第一行LIBS左邊不可以按“Tab”鍵。變量與變量內(nèi)容在“=”兩邊不能具有“:”。習(xí)慣上,變量最好是以“大寫字母”為主。運(yùn)用變量時(shí),使用${變量}或$(變量)。該shell的環(huán)境變量是可以被套用的,例如提到的CFLAGS這個(gè)變量。在命令行模式也可以定義變量。二、項(xiàng)目實(shí)施——任務(wù)7-6使用make進(jìn)行宏編譯由于gcc在進(jìn)行編譯的行為時(shí),會主動(dòng)地去讀取CFLAGS這個(gè)環(huán)境變量,所以,可以直接在shell定義這個(gè)環(huán)境變量,也可以在makefile文件里面去定義,或者在命令行當(dāng)中定義。例如:[root@Server01c]#CFLAGS="-Wall"makecleanmain#這個(gè)操作在make上進(jìn)行編譯時(shí),會取用CFLAGS的變量內(nèi)容二、項(xiàng)目實(shí)施——任務(wù)7-8使用RPM軟件管理程序RPM的使用只要使用rpm命令即可。1.RPM默認(rèn)安裝的路徑RPM類型的文件在安裝的時(shí)候,會先讀取文件內(nèi)記載的配置參數(shù)內(nèi)容,然后將該數(shù)據(jù)比對Linux系統(tǒng)的環(huán)境,以找出是否有屬性依賴的軟件尚未安裝。例如openssh軟件的安裝需要通過openssl軟件,所以得先安裝openssl才能安裝openssh。如果環(huán)境沒有openssl,就無法安裝openssh。二、項(xiàng)目實(shí)施——任務(wù)7-8使用RPM軟件管理程序若環(huán)境檢查合格,RPM文件就開始被安裝到Linux系統(tǒng)上。安裝完畢后,該軟件相關(guān)的信息就會被寫入/var/lib/rpm/目錄下的數(shù)據(jù)庫文件中。上面這個(gè)目錄內(nèi)的數(shù)據(jù)很重要。因?yàn)槲磥砣绻腥魏诬浖壍男枨?,版本之間的比較就是來自于這個(gè)數(shù)據(jù)庫,而如果想要查詢系統(tǒng)已經(jīng)安裝的軟件,也是從這里查詢的。同時(shí),目前的RPM也提供數(shù)字簽名信息,這些數(shù)字簽名信息也是在這個(gè)目錄內(nèi)記錄的。所以,目錄不能被刪除。軟件內(nèi)的文件存放與文件系統(tǒng)有關(guān)。表7-4是某些重要目錄的含義。表7-4重要目錄的含義目錄含義/etc一些配置檔放置的目錄,例如/etc/crontab/usr/bin一些可運(yùn)行文件/usr/lib一些程序使用的動(dòng)態(tài)函數(shù)庫/usr/share/doc一些基本的軟件使用手冊與說明檔/usr/share/man一些manpage文件二、項(xiàng)目實(shí)施——任務(wù)7-8使用RPM軟件管理程序2.RPM安裝(install)rpm安裝時(shí)常用的選項(xiàng)與參數(shù)說明選項(xiàng)
代表意義--nodeps使用時(shí)機(jī):當(dāng)發(fā)生軟件屬性依賴問題而無法安裝,但強(qiáng)制安裝時(shí)危險(xiǎn)性:軟件之所以有依賴性,是因?yàn)楸舜藭褂玫綄Ψ降臋C(jī)制或功能,如果強(qiáng)制安裝而不考慮軟件的屬性依賴,則可能會造成該軟件無法正常使用--replacefiles使用時(shí)機(jī):如果在安裝的過程當(dāng)中出現(xiàn)了“某個(gè)文件已經(jīng)被安裝在你的系統(tǒng)上面”的信息,又或許出現(xiàn)版本不兼容的信息(confilctingfiles)時(shí),可以使用這個(gè)參數(shù)來直接覆蓋文件危險(xiǎn)性:覆蓋的操作是無法復(fù)原的!所以,必須要很清楚地知道被覆蓋的文件是真的可以被覆蓋,否則后果就很嚴(yán)重了--replacepkgs使用時(shí)機(jī):重新安裝某個(gè)已經(jīng)安裝過的軟件。如果要安裝很多RPM軟件文件時(shí),可以使用rpm-ivh*.rpm,但若某些軟件已經(jīng)安裝過了,此時(shí)系統(tǒng)會出現(xiàn)“某軟件已安裝”的信息,導(dǎo)致無法繼續(xù)安裝。此時(shí)可使用這個(gè)選項(xiàng)來重復(fù)安裝--force使用時(shí)機(jī):這個(gè)參數(shù)其實(shí)就是--replacefiles與--replacepkgs的綜合體--test使用時(shí)機(jī):想要測試一下該軟件是否可以被安裝到使用者的Linux環(huán)境當(dāng)中,可找出是否有屬性依賴的問題。范例:rpm-ivhpkgname.i386.rpm--test--justdb使用時(shí)機(jī):由于RPM數(shù)據(jù)庫破損或者是某些緣故產(chǎn)生錯(cuò)誤時(shí),可使用這個(gè)選項(xiàng)來升級軟件在數(shù)據(jù)庫內(nèi)的相關(guān)信息--nosignature使用時(shí)機(jī):想要略過數(shù)字簽名的檢查時(shí),可以使用這個(gè)選項(xiàng)--prefix新路徑使用時(shí)機(jī):要將軟件安裝到其他非正規(guī)目錄時(shí)。例如:想要將某軟件安裝到/usr/local而非正規(guī)的/bin,/etc等目錄,就可以使用“--prefix/usr/local”來處理了--noscript使用時(shí)機(jī):不想讓該軟件在安裝過程中自行運(yùn)行某些系統(tǒng)命令說明:RPM的優(yōu)點(diǎn)除了可以將文件存放到指定位置之外,還可以自動(dòng)運(yùn)行一些前置作業(yè)的命令,例如數(shù)據(jù)庫的初始化。如果不想讓RPM自動(dòng)運(yùn)行這一類型的命令,就加上這個(gè)參數(shù)二、項(xiàng)目實(shí)施——任務(wù)7-9使用dnf在本項(xiàng)目開始部分介紹過dnf,dnf是通過分析RPM的標(biāo)題數(shù)據(jù)后,根據(jù)各軟件的相關(guān)性制作出屬性依賴時(shí)的解決方案,然后可以自動(dòng)處理軟件的依賴屬性問題,以解決軟件安裝或移除與升級的問題。詳細(xì)的dnf服務(wù)器與用戶端之間的溝通,可以參看圖7-1的說明。由于distribution必須先發(fā)布軟件,然后將軟件放在dnf服務(wù)器上面,供用戶端進(jìn)行安裝與升級之用。因此想要使用dnf的功能時(shí),必須要先找到適合的dnfServer才行。而每個(gè)dnfServer可能都會提供許多不同的軟件功能,那就是之前談到的“容器”。因此,必須前往dnfServer查詢到相關(guān)的容器網(wǎng)址后,再繼續(xù)處理后續(xù)的配置工作。二、項(xiàng)目實(shí)施——任務(wù)7-9使用dnf事實(shí)上RHEL發(fā)布出軟件時(shí)已經(jīng)制作出多部映射站點(diǎn)(mirrorsite)提供給全世界的用戶進(jìn)行軟件升級使用。所以,理論上不需要處理任何配置值,只要能夠連上Internet,就可以使用dnf。1.BaseOS和AppStream在RHEL8中提出了一個(gè)新的設(shè)計(jì)理念,即AppStream(應(yīng)用程序流),這樣就可以比以往更輕松地升級用戶空間軟件包,同時(shí)保留核心操作系統(tǒng)軟件包。AppStream的工作原理是支持RedHat經(jīng)典RPM打包格式的新擴(kuò)展——模塊。這使用戶能夠安裝同一個(gè)程序的多個(gè)主要版本。RHEL8軟件源分成了兩個(gè)主要倉庫(repositories):BaseOS和AppStream。①BaseOS倉庫以傳統(tǒng)RPM軟件包的形式提供操作系統(tǒng)底層軟件的核心集,是基礎(chǔ)軟件安裝庫。②AppStream包括額外的用戶空間應(yīng)用程序、運(yùn)行時(shí)語言和數(shù)據(jù)庫,以支持不同的工作負(fù)載和用例。AppStream中的內(nèi)容有兩種格式——熟悉的RPM格式和稱為模塊的RPM格式擴(kuò)展。二、項(xiàng)目實(shí)施——任務(wù)7-9使用dnf【例7-12】配置本地dnf源,安裝network-scripts。(1)創(chuàng)建掛載光盤映像ISO的文件夾/media一般是系統(tǒng)安裝時(shí)建立的,讀者可以不必新建文件夾,直接使用該文件夾即可。但如果想把光盤映像ISO掛載到其他文件夾,則請自建。(1)新建配置文件/etc/yum.repos.d/dvd.repo[root@Server01~]#vim/etc/yum.repos.d/dvd.repo[root@Server01~]#cat/etc/yum.repos.d/dvd.repo[Media]name=Meidabaseurl=file:///media/BaseOSgpgcheck=0enabled=1二、項(xiàng)目實(shí)施——任務(wù)7-9使用dnf(2)掛載光盤映像ISO(保證/media存在)。本書中,一般黑體表示輸入命令。[root@Server01~]#mount/dev/cdrom/mediamount:/media:WARNING:devicewrite-protected,mountedread-only.[root@Server01~]#(3)清理緩存[root@Server01~]#dnfcleanall[root@Server01~]#dnfmakecache //建立元數(shù)據(jù)緩存二、項(xiàng)目實(shí)施——任務(wù)7-9使用dnf(4)查看[root@Server01~]#dnfrepolist //查看系統(tǒng)中可用和不可用的所有的DNF軟件庫[root@Server01~]#dnflist //列出所有RPM包[root@Server01~]#dnflistinstalled //列出所有安裝了的RPM包[root@Server01~]#dnflistavailable //列出所有可供安裝的RPM包[root@Server01~]#dnflistavailable //列出所有可供安裝的RPM包[root@Server01~]#dnfsearchnetwork-scripts//搜索軟件庫中的RPM包[root@Server01~]#dnfprovides/bi
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年綠春縣招教考試備考題庫含答案解析(必刷)
- 2025年羅江縣幼兒園教師招教考試備考題庫及答案解析(奪冠)
- 2025年西盟縣幼兒園教師招教考試備考題庫帶答案解析(奪冠)
- 2025年貴州醫(yī)科大學(xué)神奇民族醫(yī)藥學(xué)院馬克思主義基本原理概論期末考試模擬題帶答案解析(奪冠)
- 2025年鄭州財(cái)稅金融職業(yè)學(xué)院單招職業(yè)技能考試題庫帶答案解析
- 2025年長春工程學(xué)院馬克思主義基本原理概論期末考試模擬題及答案解析(奪冠)
- 參與校外培訓(xùn)管理制度
- 辦公室規(guī)范化制度
- 高壓電工培訓(xùn)制度
- 監(jiān)理培訓(xùn)技術(shù)交底制度
- 2026年醫(yī)保藥品目錄調(diào)整
- 2026四川雅安市漢源縣審計(jì)局招聘編外專業(yè)技術(shù)人員2人筆試備考試題及答案解析
- 2026年孝昌縣供水有限公司公開招聘正式員工備考題庫及答案詳解1套
- 2026年廠房建設(shè)中的BIM技術(shù)應(yīng)用分析
- 2022-2023學(xué)年廣東省廣州市天河區(qū)九年級上學(xué)期期末化學(xué)試題(含答案)
- 2026年及未來5年市場數(shù)據(jù)中國氯堿行業(yè)發(fā)展趨勢預(yù)測及投資規(guī)劃研究報(bào)告
- 2025年院感年終科室工作總結(jié)
- 網(wǎng)絡(luò)項(xiàng)目轉(zhuǎn)讓合同范本
- (2025年)心血管-腎臟-代謝綜合征綜合管理中國專家共識解讀課件
- AI醫(yī)療數(shù)據(jù)匿名化:監(jiān)管技術(shù)標(biāo)準(zhǔn)
- 食品銷售業(yè)務(wù)員培訓(xùn)課件
評論
0/150
提交評論