Linux代码编译(模式切换、gdb、编译器之间的对比、彩色进度条、rpm与yum区别)
常用工具:
軟件包管理工具:yum
編程相關工具:vim、gcc/g++、gdb
項目相關工具:make/Makefile、git
查看軟件包:yum list/grep key
安裝軟件包:yum install package_name
刪除軟件包:yum remove package_name
編譯器:vim
vim中的操作模式共12種,常用的有3種。
普通模式:主要是指用命令進行文件內容操作
控制屏幕光標的移動,字符、字或行的刪除,移動復制某區段及進入Insert mode下,或者到 last line mode
插入模式:插入數據
只有在Insert mode下,才可以做文字輸入,按「ESC」鍵可回到命令行模式。該模式是我們后面用的最頻繁的編輯模式
底行模式:用于文件內容的保存和退出
文件保存或退出,也可以進行文件替換,找字符串,列出行號等操作。 在命令模式下,shift+: 即可進入該模式。要查看你的所有模式:打開vim,底行模式直接輸入
模式切換:
普通->插入:i a o I A O
插入->普通:ESC鍵(所有模式切換至普通均適用該方式)
i:從光標所在位置開始插入
a:光標向后移動一個字符開始插入
o:光標所在行下方增加新行開始出入
I: 光標移動到行首開始插入
A: 光標移動到行尾開始插入
O:光標所在行上方添加新行開始插入
普通->底行:輸入:
:w(保存當前文件)
:q(退出)
:wq(保存并退出)
:q!(強制退出)
普通模式下的命令操作:
插入模式:
光標移動操作:
對文件內容操作:
底行模式操作:
編譯器:gcc/g++
功能:將高級語言解釋成機器可識別的指令
預處理:展示所有代碼 gcc-E
預處理功能主要包括宏定義,文件包含,條件編譯,去注釋等。
預處理指令是以#號開頭的代碼行。
選項“-E”,該選項的作用是讓 gcc 在預處理結束后停止編譯過程。
選項“-o”是指目標文件,“.i”文件為已經過預處理的C原始程序。
實例: gcc –E hello.c –o hello.i
編譯:進行語法語義糾錯。若無錯誤,則將程序解釋為匯編語言 gcc-S
在這個階段中,gcc 首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤后,gcc 把代碼翻譯成匯編語言。
用戶可以使用“-S”選項來進行查看,該選項只進行編譯而不進行匯編,生成匯編代碼。
實例: gcc –S hello.i –o hello.s
匯編:將會匯編語言解釋成為二進制機器指令 gcc-C
匯編階段是把編譯階段生成的“.s”文件轉成目標文件
讀者在此可使用選項“-c”就可看到匯編代碼已轉化為“.o”的二進制目標代碼了
實例: gcc –c hello.s –o hello.o
鏈接:將所有的.o文件和庫文件進行打包,最終成為一個可執行程序
在成功編譯之后,就進入了鏈接階段。
實例: gcc hello.o –o hello
庫文件:封裝的函數所打包的一個代碼文件
鏈接方式:動態鏈接,靜態鏈接。
1.動態鏈接——鏈接動態庫
在可執行程序添加庫中的函數符號信息表,生成的可執行程序比較小。因為并沒有把函數的實現直接加入到可執行程序中。因此運行程序的時候需要依賴動態庫的存在。但是在內存中多個程序可以共用相同庫。從而降低了代碼冗余。動態庫一般后綴名為“.so”
2.靜態鏈接——鏈接靜態庫
在生成可執行程序時,直接將庫中的所有代碼實現都寫入到了可執行程序中。生成的可執行程序比較大。在運行程序時,若多個程序都靜態鏈接了同一個庫文件,會在內存中造成代碼冗余。但靜態鏈接的程序運行時不依賴庫存在。其后綴名一般為“.a”
gcc的默認鏈接方式:動態
在生成可執行程序時默認連接標準c庫。
調試器:gdb
1.調試的前提:debug版本的程序
gcc默認生成release版本程序,因此要在編譯程序時使用gcc-g生成debug程序
程序調試:
1.gdb加載程序符號信息
gdb./main gdb->file main
2.流程控制指令
run:直接運行程序
start:開始調試
list:查看調試行附近代碼 list file:line
until:直接運行到指定行 until file:line
next:下一步(直接運行)
strp:下一步(跟蹤進入函數)
continue:從當前位置開始運行程序
3.斷點相關指令
break:在某一行設置斷點
break file:line:給指定函數指定行打斷點
break func_name: 給指定函數開頭打斷點
info break:查看斷點信息
delete break id:刪除指定(序號為id)斷點
delete break:刪除所有斷點
watch variable_name:給變量打斷點
4.其它指令
quit:退出gdb
breaktrace(或bt):查看各級函數調用及參數
print(p):打印表達式的值,通過表達式可以修改變量的值或者調用函數
自動化構建工具:make/Makefile
1.Makefile:普通的文本文件-記錄項目的構建流程規則
make:Makefile解釋器-逐行解釋Makefile中的項目構建規則,完成項目的構建
Makefile的編寫規則:
目標對象:依賴對象
\t 要執行的指令
目標對象:要生成的可執行程序名稱
依賴對象:源碼文件 通過對目標對象的最后一次修改時間判斷,目標對象是否需要重新生成
預定義變量:
$^ 表示所有的依賴對象
$@ 表示目標對象
$< 第一個依賴對象
.PHONY:聲明偽對象—不管對象是否最新、是否存在,每次都需要重新生成(通常用于聲明clean)
make的解釋執行規則:
1.make在Makefile中只尋找第一個目標對象進行生成,生成完畢則退出
2.在生成目標對象之前,先判斷依賴對象是否需要生成(先找依賴對象的生成規則,)
最簡單:
main:main.c child.c gcc $^ -0 $@ .PHONY:clean clean:rm -f main升級版:
main:main.o child.o gcc $^ -0 $@ %.o:%.c gcc $^ -0 $@.PHONY:clean clean:rm -f main wildcard:獲取當前路徑下以.c結尾的文件名 src=$(wildcard ./*.c) 字符替換 將變量內容中的后綴名 從.c修改為.o賦值給obj obj=$(patsubsr %.c,%.o,$(src))make工作原理:
當我們只輸入make命令時:
而對于所定義的命令的錯誤,或是編譯不成功,make根本不理。
項目的版本管理工具:git–分布式管理工具
這里涉及到github的使用。個人認為gethub是一個非常好用的軟件。
其他常用的編輯器之間的橫向對比以及編輯器之間的區別和優缺點
Vim
Vim是從 vi 發展出來的一個文本編輯器。代碼補完、編譯及錯誤跳轉等方便編程的功能特別豐富,在程序員中被廣泛使用。和Emacs并列成為類Unix系統用戶最喜歡的編輯器。
Eclipse
Eclipse是一款很酷的開源代碼編輯器,它擁有代碼高亮和智能提示等強大的功能。在Eclipse中,完全勝任以下編程語言的工作——Python, R, Ruby, JavaScript, Natural, Lasso, C, C++, COBOL, Scheme, Clojure, Groovy等等,它也是Java集成開發環境,甚至提供了對Java 8的支持。在一些Web開發IDE特性的幫助下,你可以非常方便地對代碼文件進行組織和訪問。
Brackets
Brackets也是一款為Linux開發者設計的開源代碼編輯器,使用Brackets寫代碼,你不會被任何事情所打斷。比如在寫HTML代碼時,即便你沒有保存代碼也可以及時預覽你的Web頁面效果。你也可以使用Theseus來檢查變量,Brackets默認提供一種主題,當然你也可以在擴展中心獲取更多的主題。
Emacs
Emacs不僅僅是一個編輯器,他是一個整合環境,或可稱它為集成開發環境,這些功能如讓使用者置身于全功能的操作系統中。Emacs不僅可以作為文本編輯器,還可以用來收發電子郵件、通過FTP/TRAMP編輯遠程檔案、通過Telnet登錄主機、上新聞組、登陸IRC和朋友交流、查看日歷等功能。
Light Table
LightTable是一個免費開放源代碼的編輯器,該編輯器有一個非常干凈的界面,并有大量擴展。它與Windows、Mac和Linux都兼容,是高度可定制的。使用Light Table,開發者只需打開一個瀏覽器窗口即可實時查看更改,并且支持不同的嵌入。
Chocolat
Chocolat本身是Mac OS X的最佳代碼編輯器。該編輯器旨在與OS無縫集成,Chocolat為JS、Python和HTML提供拖放功能、拆分編輯、代碼折疊和代碼完成。
Sublime Text
一個緊湊但性能較高的代碼編輯器一個跨平臺的代碼編輯器,適用于所有WordPress項目。 Sublime Text有很多功能可以提供: 腳本編程、自定義界面、常規文件切換、合成和錯誤檢測、多媒體選擇和編輯、外部插件集成、Themes
彩色進度條:(藍底紅色#)
test:test.c gcc -o test test.c .PHONY:clean clean: rm -f test vim test.c#include <stdio.h> #include <unistd.h> #include<string.h> int main() {int i = 0; char bar[101]; const char *lable = "|/-\\"; for(i=0;i<=100;i++) {bar[i]='\0'; printf("\033[1;31;44m%s\033[0m [%d%%][%c]\r",bar,i,lable[i%4]); fflush(stdout); bar[i]='#'; usleep(100000); } printf("\n"); return 0; }rpm和yum的區別:
rpm安裝
rpm安裝:安裝別人編譯好的軟件包
rpm即Redhat Package Manager,Redhat的軟件包管方式,適用rpm install 命令
rpm不僅已經把軟件源代碼編譯成二進制文件,而且對軟件包依賴的文件,系統環境等做了統計文件擴展名:rpm
還有一種SRPM:沒有編譯成二進制文件,但是也包含rpm的特性
yum安裝
用rpm方式安裝軟件,如果依賴的軟件沒有事先安裝,軟件無法安裝成功。
為了解決這個問題,推出yum方式。
既然依賴的軟件沒有安裝在機器上,那么就先安裝依賴文件,再安裝我需要安裝的軟件。
因此yum在安裝軟件同時安裝依賴文件。
因此需要一個yum源來放依賴的軟件源,對比被安裝機器上rpm軟件庫歸根到底,yum也是基于rpm的。
總結
以上是生活随笔為你收集整理的Linux代码编译(模式切换、gdb、编译器之间的对比、彩色进度条、rpm与yum区别)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAP BASIS ADM100 中文版
- 下一篇: linux下的office 速度慢,Mi