自己動手構造編譯
1. 學習編譯原理之前需要學哪些知識
1.你要學到什麼水平?是想考試考好還是想實際寫出來一個足夠強度的編譯器?如果是前者,就一句:努力當學霸才是你唯一的出路。
2.對於scanner &parser的話,對於書上所講的演算法的要求是很高的,有很大的依賴性,所以必須理解透徹,即使沒有機會實現也要自己動手畫畫。同時這也是本科階段所學的編譯原理的所有內容。雖然flex和bison很好使,但是強烈不建議使用。
3.對於生成器、連接器或者解釋器的話,那麼你要了解匯編語言、微處理器、微機介面等計算機基礎學科。簡單的說就是從底層學到高級語言的層面。這個要求是很高的,畢竟涉及到二進制代碼優化等很麻煩的。
2. 裝了多個版本的rpm 哪一個生效
要經過GCC命令在本機編譯後方可使用
在Linux系統中,安裝軟體最常見的有兩種:
一種是軟體的源代碼,您需要自己動手編譯它。這種軟體安裝包通常是用gzip壓縮過的tar包(後綴名為.tar.gz)。
另一種是軟體的可執行程序,你只要安裝它就可以了。這種軟體安裝包通常是一個RPM包(RedHat Linux Packet Manager,就是RedHat的軟體包管理器),後綴名是.rpm。當然,也有用RPM格式打包的源代碼、用gzip壓縮過的可執行套裝程序。只要您理解了以下的思路,這兩種形式的安裝包也不在話下了。
源代碼編譯安裝
Linux軟體的源代碼分發是指提供了該軟體所有程序源代碼的發布形式,需要用戶自己編譯成可執行的二進制碼並進行安裝。其優點是配置靈活,可以隨意去掉或保留某些功能/模塊,適應多種硬體/操作系統平台及編譯環境;缺點是難度較大,一般不適合初學者使用。
各個軟體的源代碼包一般都在各個軟體項目的主頁中提供下載,例如:等。
1.*.src.rpm形式的源代碼軟體包
安裝:
rpm -rebuild *.src.rpm
cd /usr/src/dist/RPMS
rpm -ivh *.rpm
卸載:
rpm -e packgename
說明:rpm --rebuild *.src.rpm命令將源代碼編譯並在/usr/src/dist/RPMS下生成二進制的RPM軟體包,然後再安裝該二進制包即可。Packgename如前所述。
2.*.tar.gz/*.tgz/*.bz2形式的源代碼軟體包
以tar.gz或tgz或tar.bz2等格式結尾的軟體包一般都是以源代碼方式發布的軟體,安裝這類軟體首先需要對軟體進行解壓:
# tar zxvf filename.tar.gz
# tar xvfz filename.tgz
# tar xvf j filename.tar.bz2
解壓以後,就可以進入解壓後的目錄:
# cd filename/
對於這類文檔,常見的安裝步驟是:配置、編譯和安裝3步,其中最麻煩的就是配置,因為所有和軟體安裝相關的配置都是在這一步指定的:比如軟體安裝位置等。
配置:./configure
編譯:make
安裝:make install
卸載:make uninstall 或手動刪除
說明:建議解壓後先閱讀說明文件(ReadMe和Install),了解安裝的需求,有必要時還需改動編譯配置。有些軟體包的源代碼在編譯安裝後可以用make uninstall命令來進行卸載,如果不提供此功能,則軟體的卸載必須手動進行。由於軟體可能將文件分散地安裝在系統的多個目錄中,往往很難把它刪除干凈,那你應該在編譯前進行配置,指定軟體將要安裝到目標路徑:./configure --prefix=目錄名,這樣可以使用「rm -rf 軟體目錄名」命令來進行干凈徹底的卸載。與其他安裝方式相比,需要用戶自己編譯安裝是最難的,它適合於使用Linux已有一定經驗的人,一般不推薦初學者使用。
RPM格式軟體包的安裝
RPM是RedHat公司開發的軟體包管理器,使用它可以很容易地對RPM形式的軟體包進行安裝、升級、卸載、驗證、查詢等操作,安裝簡單,而卸載時也可以將軟體安裝在多處目錄中的文件刪除干凈,因此推薦初學者盡可能使用RPM形式的軟體包。軟體包往往有特定的命令規范,名字是由「文件名+版本號+. rpm」組成的字串,例如apache-3.1.12-i386.rpm和apache-devel-3.1.12-i386.rpm,它們的軟體包名稱分別是apache和apache-devel。各個支持RPM格式的Linux常見軟體的RPM包可以在網站rpmfind.net中找到。
1.安裝
命令格式:
rpm-i(or--install) options file1.rpm ... fileN.rpm
參數:
file1.rpm...fileN.rpm指將要安裝的RPM包的文件名。
詳細選項:
-h(or—hash)安裝時輸出hash記號;test只對安裝進行測試,並不實際安裝;--percent以百分比的形式輸出安裝的進度;-- excludedocs不安裝軟體包中的文檔;--includedocs安裝文檔;--replacepkgs強制重新安裝已經安裝的軟體包;-- replacefiles替換屬於其他軟體包的文件;--force忽略軟體包及文檔的沖突;--noscripts不運行預安裝和後安裝腳本;-- prefix NEWPATH將軟體包安裝到由NEWPATH指定的路徑下;--ignorearch不校驗軟體包的結構;--ignoreos不檢查軟體包運行的操作系統;--nodeps不檢查依賴性關系;--ftpproxy HOST用HOST作為FTP代理;--ftpport PORT指定FTP的埠號為PORT。
通用選項:
-v顯示附加信息;-vv顯示調試信息;--root DIRECTORY讓RPM將DIRECTORY指定的路徑作為根目錄,這樣預安裝程序和後安裝程序都會安裝到這個目錄下;--rcfile FILELIST設置rpmrc文檔為FILELIST;--dbpath DIRECTORY設置RPM資料庫所在的路徑為DIRECTORY。
2.刪除
命令格式:
rpm -e(or--erase) options pkg1 ... pkgN
參數:
pkg1...pkgN:要刪除的軟體包。
詳細選項:
--test只執行刪除的測試;--noscripts不運行預安裝和後安裝腳本程序;--nodeps不檢查依賴性。
通用選項:
-vv顯示調試信息;--root DIRECTORY讓RPM將DIRECTORY指定的路徑作為根目錄,這樣預安裝程序和後安裝程序都會安裝到這個目錄下;--rcfile FILELIST設置rpmrc文檔為FILELIST;--dbpath DIRECTORY設置RPM資料庫所在的路徑為DIRECTORY。
3.升級
命令格式:
rpm -U(or--upgrade) options file1.rpm ... fileN.rpm
參數:
file1.rpm...fileN.rpm指軟體包的名字。
詳細選項:
-h(or—hash)安裝時輸出hash記號;—oldpackage允許一個舊版本;--test只進行升級測試;--excludedocs不安裝軟體包中的文件;--includedocs安裝文件;--replacepkgs強制重新安裝已經安裝的軟體包;--replacefiles替換屬於其他軟體包的文件;--force忽略軟體包及文件的沖突;--percent以百分比的形式輸出安裝的進度;--noscripts不運行預安裝和後安裝腳本;--prefix NEWPATH將軟體包安裝到由NEWPATH指定的路徑下;--ignorearch不校驗軟體包的結構;--ignoreos不檢查軟體包運行的操作系統;--nodeps不檢查依賴性關系;--ftpproxy HOST用HOST作為FTP代理;--ftpport HOST指定FTP的埠號為HOST。
通用選項:
-v顯示附加信息;-vv顯示調試信息;--root DIRECTORY讓RPM將DIRECTORY指定的路徑作為根目錄,這樣預安裝程序和後安裝程序都會安裝到這個目錄下;--rcfile FILELIST設置rpmrc文件為FILELIST ;--dbpath DIRECTORY設置RPM資料庫所在的路徑為DIRECTORY。
4.查詢
命令格式:
rpm -q(or--query) options
參數:
pkg1...pkgN:查詢已安裝的軟體包。
詳細選項:
-p PACKAGE_FILE查詢軟體包的文件;-f FILE查詢FILE屬於哪個軟體包;-a查詢所有安裝的軟體包;--whatproVides CAPABILITY查詢提供了CAPABILITY功能的軟體包;-g group查詢屬於group組的軟體包;--whatrequires CAPABILITY查詢所有需要CAPABILITY功能的軟體包。
選項:
-i顯示軟體包的概要信息;-l顯示軟體包中的文件列表;-c顯示配置文件列表;-d顯示文件列表;-s顯示軟體包中文檔列表並顯示每個文件的狀態 -;-scripts顯示安裝、卸載、校驗腳本;--queryformat(or--qf)以用戶指定的方式顯示查詢信息;--mp顯示每個文件的所有已校驗信息;--proVides顯示軟體包提供的功能;--requires(or-R)顯示軟體包所需的功能。
通用選項:
-v顯示附加信息;-vv顯示調試信息;--root DIRECTORY讓RPM將DIRECTORY指定的路徑作為根目錄,這樣預安裝程序和後安裝程序都會安裝到這個目錄下;-rcfile FILELIST設置rpmrc文件為FILELIST;--dbpath DIRECTORY設置RPM資料庫所在的路徑為DIRECTORY。
5.校驗已安裝的軟體包
命令格式:
rpm -V(or--verify,or-y) options
參數:
pkg1...pkgN將要校驗的軟體包名
軟體包選項:
-p PACKAGE_FILE校驗PACKAGE_FILE所屬的軟體包;-a校驗所有的軟體包;-g group校驗所有屬於組group的軟體包。
詳細選項:
--noscripts不運行校驗腳本;--nodeps不校驗依賴性;--nofiles不校驗文檔屬性。
通用選項:
-v顯示附加信息;-vv顯示調試信息;--root PATH讓RPM將PATH指定的路徑做為根目錄,這樣預安裝程序和後安裝程序都會安裝到這個目錄下;--rcfile FILELIST設置rpmrc文件為FILELIST;--dbpath DIRECTORY設置RPM資料庫所在的路徑為DIRECTORY。
6.校驗軟體包中的文件
語法:
rpm -K(or--checksig) options file1.rpm...fileN.rpm
參數:
file1.rpm...fileN.rpm軟體包的文件名;Checksig--詳細選項;--nopgp不校驗PGP簽名。
通用選項:
-v顯示附加信息;-vv顯示調試信息;--rcfile FILELIST設置rpmrc文件為FILELIST。
7.其他RPM選項
--rebuilddb重建RPM資料庫;--initdb創建一個新的RPM資料庫;--quiet盡可能地減少輸出;--help顯示幫助文件;--version顯示RPM的當前版本。
如果你不喜歡在字元介面下安裝或卸載這些軟體包,完全可以安裝基於X-Window的圖形介面軟體包管理程序,如glint, xrpm這樣的圖形介面。或使用KDE的KPackage(單擊→,在其中輸入KPackage即可啟動KPackage)等,這樣對軟體包的安裝、升級、卸載、驗證和查詢就可以通過單擊滑鼠來輕松完成,如圖所示。
需要注意的是,每個RPM軟體包格式的軟體並不一定是獨立的,各個RPM軟體包之間有一定的依賴關系,刪除某個RPM軟體包可能導致別的軟體不能使用。因此在升級和刪除時應該注意。
要經過GCC命令在本機編譯後方可使用
在Linux系統中,安裝軟體最常見的有兩種:
一種是軟體的源代碼,您需要自己動手編譯它。這種軟體安裝包通常是用gzip壓縮過的tar包(後綴名為.tar.gz)。
另一種是軟體的可執行程序,你只要安裝它就可以了。這種軟體安裝包通常是一個RPM包(RedHat Linux Packet Manager,就是RedHat的軟體包管理器),後綴名是.rpm。當然,也有用RPM格式打包的源代碼、用gzip壓縮過的可執行套裝程序。只要您理解了以下的思路,這兩種形式的安裝包也不在話下了。
源代碼編譯安裝
Linux軟體的源代碼分發是指提供了該軟體所有程序源代碼的發布形式,需要用戶自己編譯成可執行的二進制碼並進行安裝。其優點是配置靈活,可以隨意去掉或保留某些功能/模塊,適應多種硬體/操作系統平台及編譯環境;缺點是難度較大,一般不適合初學者使用。
各個軟體的源代碼包一般都在各個軟體項目的主頁中提供下載,例如:等。
1.*.src.rpm形式的源代碼軟體包
安裝:
rpm -rebuild *.src.rpm
cd /usr/src/dist/RPMS
rpm -ivh *.rpm
卸載:
rpm -e packgename
說明:rpm --rebuild *.src.rpm命令將源代碼編譯並在/usr/src/dist/RPMS下生成二進制的RPM軟體包,然後再安裝該二進制包即可。Packgename如前所述。
2.*.tar.gz/*.tgz/*.bz2形式的源代碼軟體包
以tar.gz或tgz或tar.bz2等格式結尾的軟體包一般都是以源代碼方式發布的軟體,安裝這類軟體首先需要對軟體進行解壓:
# tar zxvf filename.tar.gz
# tar xvfz filename.tgz
# tar xvf j filename.tar.bz2
解壓以後,就可以進入解壓後的目錄:
# cd filename/
對於這類文檔,常見的安裝步驟是:配置、編譯和安裝3步,其中最麻煩的就是配置,因為所有和軟體安裝相關的配置都是在這一步指定的:比如軟體安裝位置等。
配置:./configure
編譯:make
安裝:make install
卸載:make uninstall 或手動刪除
說明:建議解壓後先閱讀說明文件(ReadMe和Install),了解安裝的需求,有必要時還需改動編譯配置。有些軟體包的源代碼在編譯安裝後可以用make uninstall命令來進行卸載,如果不提供此功能,則軟體的卸載必須手動進行。由於軟體可能將文件分散地安裝在系統的多個目錄中,往往很難把它刪除干凈,那你應該在編譯前進行配置,指定軟體將要安裝到目標路徑:./configure --prefix=目錄名,這樣可以使用「rm -rf 軟體目錄名」命令來進行干凈徹底的卸載。與其他安裝方式相比,需要用戶自己編譯安裝是最難的,它適合於使用Linux已有一定經驗的人,一般不推薦初學者使用。
RPM格式軟體包的安裝
RPM是RedHat公司開發的軟體包管理器,使用它可以很容易地對RPM形式的軟體包進行安裝、升級、卸載、驗證、查詢等操作,安裝簡單,而卸載時也可以將軟體安裝在多處目錄中的文件刪除干凈,因此推薦初學者盡可能使用RPM形式的軟體包。軟體包往往有特定的命令規范,名字是由「文件名+版本號+. rpm」組成的字串,例如apache-3.1.12-i386.rpm和apache-devel-3.1.12-i386.rpm,它們的軟體包名稱分別是apache和apache-devel。各個支持RPM格式的Linux常見軟體的RPM包可以在網站rpmfind.net中找到。
1.安裝
命令格式:
rpm-i(or--install) options file1.rpm ... fileN.rpm
參數:
file1.rpm...fileN.rpm指將要安裝的RPM包的文件名。
詳細選項:
-h(or—hash)安裝時輸出hash記號;test只對安裝進行測試,並不實際安裝;--percent以百分比的形式輸出安裝的進度;-- excludedocs不安裝軟體包中的文檔;--includedocs安裝文檔;--replacepkgs強制重新安裝已經安裝的軟體包;-- replacefiles替換屬於其他軟體包的文件;--force忽略軟體包及文檔的沖突;--noscripts不運行預安裝和後安裝腳本;-- prefix NEWPATH將軟體包安裝到由NEWPATH指定的路徑下;--ignorearch不校驗軟體包的結構;--ignoreos不檢查軟體包運行的操作系統;--nodeps不檢查依賴性關系;--ftpproxy HOST用HOST作為FTP代理;--ftpport PORT指定FTP的埠號為PORT。
通用選項:
-v顯示附加信息;-vv顯示調試信息;--root DIRECTORY讓RPM將DIRECTORY指定的路徑作為根目錄,這樣預安裝程序和後安裝程序都會安裝到這個目錄下;--rcfile FILELIST設置rpmrc文檔為FILELIST;--dbpath DIRECTORY設置RPM資料庫所在的路徑為DIRECTORY。
2.刪除
命令格式:
rpm -e(or--erase) options pkg1 ... pkgN
參數:
pkg1...pkgN:要刪除的軟體包。
詳細選項:
--test只執行刪除的測試;--noscripts不運行預安裝和後安裝腳本程序;--nodeps不檢查依賴性。
通用選項:
-vv顯示調試信息;--root DIRECTORY讓RPM將DIRECTORY指定的路徑作為根目錄,這樣預安裝程序和後安裝程序都會安裝到這個目錄下;--rcfile FILELIST設置rpmrc文檔為FILELIST;--dbpath DIRECTORY設置RPM資料庫所在的路徑為DIRECTORY。
3.升級
命令格式:
rpm -U(or--upgrade) options file1.rpm ... fileN.rpm
參數:
file1.rpm...fileN.rpm指軟體包的名字。
詳細選項:
-h(or—hash)安裝時輸出hash記號;—oldpackage允許一個舊版本;--test只進行升級測試;--excludedocs不安裝軟體包中的文件;--includedocs安裝文件;--replacepkgs強制重新安裝已經安裝的軟體包;--replacefiles替換屬於其他軟體包的文件;--force忽略軟體包及文件的沖突;--percent以百分比的形式輸出安裝的進度;--noscripts不運行預安裝和後安裝腳本;--prefix NEWPATH將軟體包安裝到由NEWPATH指定的路徑下;--ignorearch不校驗軟體包的結構;--ignoreos不檢查軟體包運行的操作系統;--nodeps不檢查依賴性關系;--ftpproxy HOST用HOST作為FTP代理;--ftpport HOST指定FTP的埠號為HOST。
通用選項:
-v顯示附加信息;-vv顯示調試信息;--root DIRECTORY讓RPM將DIRECTORY指定的路徑作為根目錄,這樣預安裝程序和後安裝程序都會安裝到這個目錄下;--rcfile FILELIST設置rpmrc文件為FILELIST ;--dbpath DIRECTORY設置RPM資料庫所在的路徑為DIRECTORY。
4.查詢
命令格式:
rpm -q(or--query) options
參數:
pkg1...pkgN:查詢已安裝的軟體包。
詳細選項:
-p PACKAGE_FILE查詢軟體包的文件;-f FILE查詢FILE屬於哪個軟體包;-a查詢所有安裝的軟體包;--whatproVides CAPABILITY查詢提供了CAPABILITY功能的軟體包;-g group查詢屬於group組的軟體包;--whatrequires CAPABILITY查詢所有需要CAPABILITY功能的軟體包。
選項:
-i顯示軟體包的概要信息;-l顯示軟體包中的文件列表;-c顯示配置文件列表;-d顯示文件列表;-s顯示軟體包中文檔列表並顯示每個文件的狀態 -;-scripts顯示安裝、卸載、校驗腳本;--queryformat(or--qf)以用戶指定的方式顯示查詢信息;--mp顯示每個文件的所有已校驗信息;--proVides顯示軟體包提供的功能;--requires(or-R)顯示軟體包所需的功能。
通用選項:
-v顯示附加信息;-vv顯示調試信息;--root DIRECTORY讓RPM將DIRECTORY指定的路徑作為根目錄,這樣預安裝程序和後安裝程序都會安裝到這個目錄下;-rcfile FILELIST設置rpmrc文件為FILELIST;--dbpath DIRECTORY設置RPM資料庫所在的路徑為DIRECTORY。
5.校驗已安裝的軟體包
命令格式:
rpm -V(or--verify,or-y) options
參數:
pkg1...pkgN將要校驗的軟體包名
軟體包選項:
-p PACKAGE_FILE校驗PACKAGE_FILE所屬的軟體包;-a校驗所有的軟體包;-g group校驗所有屬於組group的軟體包。
詳細選項:
--noscripts不運行校驗腳本;--nodeps不校驗依賴性;--nofiles不校驗文檔屬性。
通用選項:
-v顯示附加信息;-vv顯示調試信息;--root PATH讓RPM將PATH指定的路徑做為根目錄,這樣預安裝程序和後安裝程序都會安裝到這個目錄下;--rcfile FILELIST設置rpmrc文件為FILELIST;--dbpath DIRECTORY設置RPM資料庫所在的路徑為DIRECTORY。
6.校驗軟體包中的文件
語法:
rpm -K(or--checksig) options file1.rpm...fileN.rpm
參數:
file1.rpm...fileN.rpm軟體包的文件名;Checksig--詳細選項;--nopgp不校驗PGP簽名。
通用選項:
-v顯示附加信息;-vv顯示調試信息;--rcfile FILELIST設置rpmrc文件為FILELIST。
7.其他RPM選項
--rebuilddb重建RPM資料庫;--initdb創建一個新的RPM資料庫;--quiet盡可能地減少輸出;--help顯示幫助文件;--version顯示RPM的當前版本。
如果你不喜歡在字元介面下安裝或卸載這些軟體包,完全可以安裝基於X-Window的圖形介面軟體包管理程序,如glint, xrpm這樣的圖形介面。或使用KDE的KPackage(單擊→,在其中輸入KPackage即可啟動KPackage)等,這樣對軟體包的安裝、升級、卸載、驗證和查詢就可以通過單擊滑鼠來輕松完成,如圖所示。
需要注意的是,每個RPM軟體包格式的軟體並不一定是獨立的,各個RPM軟體包之間有一定的依賴關系,刪除某個RPM軟體包可能導致別的軟體不能使用。因此在升級和刪除時應該注意。
3. 新手如何學習編程
熟悉以下關鍵東西,可以邊學邊做,定期訓練,經常思考,長期積累:
1、語法。
2、基礎理論(數學、數據結構、演算法等)。
3、設計方法(編程原則、設計模式、框架設計等)。
4、庫(核心、基礎、UI、擴展、游戲引擎等)。
5、計算機相關(操作系統、網路、圖形學等)。
6、領域知識(游戲設計、網站設計等)。
7、開發工具(編輯器、IDE、自動部署等)。
8、項目管理(進度管理、分工協作、Bug管理、版本控制等)。
最普遍也是最重要的能力:創造力。努力分析並理解好做什麼以及怎麼做。要知道上面那些東西一開始都是不存在的。
具體方法包括:
1、快速閱讀入門教程和書籍,適合學習語言和基礎庫。比如我學Java讀的《Java編程思想》,練習題做過一點,然後學ActionScript就沒讀過書,只讀過Adobe官方文檔《ActionScript 3.0編程》。
2、閱讀庫的文檔、實例、源碼。比如Flash、Flex開發,熟悉官方API很重要,很多細節要具體使用時才注意到,這時候最好做個筆記,雖然我從沒看過我的筆記。
3、做一個自己感興趣或熟悉的小項目,比如我就以黑白棋游戲作為多個語言的試水項目,一樣的邏輯,便於把關注點放在語言特點上。
4、自己動手豐衣足食。廚師有菜譜,程序員可沒菜譜。比如我做游戲,最關鍵的游戲編程知識全部是動手學出來的,很少有專門針對某個業務領域(如游戲)的編程書籍,要麼是入門書,要麼是模式書(如演算法)、理論書(圖形學),很少有書籍教你如何開發一個45度角地圖系統加編輯器的,全靠自己思考,以及看前人的代碼,需要時找些網路資料。關鍵是,可以培養最重要的創造力。
對於演算法和設計模式,可以研讀下,但是關鍵還是靠平時如何使用了。新手勉強不來的。
項目管理方面的,就得靠工作經驗了,多思考多提意見不要只走流程。