高性能網(wǎng)站建設(shè)指南pdfsem競價托管
上篇文章:Linux基礎(chǔ)3-基礎(chǔ)工具1(什么是工具,yum,vim基礎(chǔ))-CSDN博客
本章重點:
1. vim詳解
2. gcc詳解
目錄
一. vim詳解?
1.1 命令模式
1.2 插入模式
1.3 底行模式?
二. gcc/g++
2.1 程序的翻譯過程(c/c++代碼執(zhí)行過程)
2.2 gcc/g++使用說明?
2.3?動態(tài)鏈接與靜態(tài)鏈接
2.4 查看Linux文件的鏈接方式和使用的標準庫
2.5 gcc/g++直接生成可執(zhí)行文件
2.6 gcc使用靜態(tài)鏈接
三. 下章重點?
3.1 自動化構(gòu)建工具make,makefile
3.2 Linux調(diào)試器gbd的使用
一. vim詳解?
? ? ? ? 我們知道vim常用的三種模式(命令模式,插入模式,底行模式)。這三種模式的轉(zhuǎn)化圖如下
1.1 命令模式
總結(jié)比較常用的vim命令
定位操作
? ? ? ? shift + 4($符號)將光標定位到該行的末尾(行右)
????????shift + 6(^符號)將光標定位到該行的行首(行左)
? ? ? ? shift + g(G)? ? ? 將光標定位到底部(底部)
? ? ? ? gg? ? ? ? ? ? ? ? ? ? ? ? ?將光標定位到頂部(頂部)
文件操作
復制:文件所在行輸入 yy,n(數(shù)字)+yy可以復制n行
粘貼:文件所在行輸入p(輸入p只粘貼一次,輸入n+p會粘貼n次)
刪除:文件所在行輸入dd,n + dd可以刪除n行
剪切:在一個光標所在處輸入dd,在林另一個光標所在處輸入 p
撤銷:輸入 u
取消撤銷:ctrl + r
編輯操作?
文件所在行替換大小寫:shirt + ~
批量化替換:shift + r 進入替換模式即可
行內(nèi)刪除:x向左刪除,X向右刪除(可以輸入n刪除n個,并且支持使用p進行剪切)
1.2 插入模式
? ? ? ? 命名模式輸入 i 或o或 a 即可進入插入模式,插入模式下直接輸入即可插入文本
1.3 底行模式?
? ? ? ? 命名模式下輸入 shift : 即可進入底行模式。
w 寫入? ? ? ? q 退出? ? ? ? wq 寫入并退出? ? ? ? w!強制寫入? ? ? ? q!強制退出
vs + 文件名? ? ? ? 可以分屏(但無論分多少屏幕,都只有一個光標)
ctrl w w即可切換到其他屏幕。
! 加 shell 命名 即可在不退出文件的情況下執(zhí)行l(wèi)inux命令
%s/printf/cout/g? ? ? ? 即可將printf都替換成cout
二. gcc/g++
? ? ? ? gcc/g++是Linux中的編譯器。用于編譯c/c++代碼
2.1 程序的翻譯過程(c/c++代碼執(zhí)行過程)
1. 預編譯:去掉注釋,頭文件展開,宏替換,條件編譯
2. 編譯:檢查語法,將代碼轉(zhuǎn)換為匯編代碼
3. 匯編:將匯編代碼轉(zhuǎn)化為可重定向的二進制機器指令(不可執(zhí)行的二進制目標文件)
4. 鏈接:鏈接多個二進制目標文件,形成可執(zhí)行的目標文件
2.2 gcc/g++使用說明?
例如:我們想編譯運行下列代碼,文件名字為 test.c
#include<stdio.h>int main()
{printf("hello wolrd!\n");return 0;
}
1. 預編譯
gcc -E test.c -o test.i -E #執(zhí)行程序的預編譯工作,完成后停下來-o #指形成文件的臨時文件名稱
2. 編譯
gcc -S test.i -o test.s-S #表示完成程序的編譯階段,變成匯編代碼之后,停下來
3. 匯編
gcc -c test.s -o test.o#完成程序的匯編工作,生成可重定向的不可執(zhí)行二進制文件。停下來
4. 鏈接
gcc test.o -o test#鏈接的過程,將庫中的代碼和我們自己寫的代碼鏈接起來,形成可執(zhí)行的二進制文件
5. 運行test
./test# ./ + 可執(zhí)行二進制文件 即可運行
2.3?動態(tài)鏈接與靜態(tài)鏈接
? ? ? ? 鏈接的本質(zhì)(關(guān)聯(lián)我們的代碼和庫代碼)
????????我們寫代碼只是寫了代碼的調(diào)用,沒有寫對應(yīng)的實現(xiàn)。只有當我們鏈接庫代碼之后,標準庫的實現(xiàn)代碼才能和我們的代碼關(guān)聯(lián)
動態(tài)鏈接:講我們的程序和通過連接器和標準庫關(guān)聯(lián),需要使用標準庫的時候去標準庫中找
靜態(tài)鏈接:鏈接的時候,不和標準庫關(guān)聯(lián),而是在我們程序內(nèi)部,將要用的方法,給我們拷貝一份,就完成了靜態(tài)鏈接
? ? ? ? 動靜態(tài)鏈接的優(yōu)缺點:
動態(tài)鏈接:由于沒有拷貝,形成的可執(zhí)行文件非常小,節(jié)省資源(占用內(nèi)存,磁盤小,也方便別人下載)。
靜態(tài)鏈接:不受庫文件的升級或者刪除,但是形成的可執(zhí)行文件非常大,且如果有多個可執(zhí)行文件,會造成代碼高度重復。
2.4 查看Linux文件的鏈接方式和使用的標準庫
前置知識:
1. Linux文件庫的命名
動態(tài)庫:libxxxxx.so
靜態(tài)庫:linxxxxx.a
2. file + 文件 (可以查看文件的鏈接方式)
3. ldd + 文件 (可以查看文件使用的標準庫)
?C語言
C++
從圖中也可得出:gcc/g++ 默認使用的是動態(tài)鏈接
運行結(jié)果如下:
2.5 gcc/g++直接生成可執(zhí)行文件
gcc test.c -o test
# gcc .c文件 -o 可執(zhí)行目標文件
# 即可直接生成可執(zhí)行文件
舉例:
2.6 gcc使用靜態(tài)鏈接
? ? ? ? 1. 如果沒有下載.c靜態(tài)庫需要先下載
? ? ? ? 2. 使用靜態(tài)鏈接
gcc test.c -o test.s -static# gcc 代碼文件.c -o 可執(zhí)行目標文件 -static
# 目標文件可以使用.s進行標識
舉例:
可以看出靜態(tài)鏈接的可執(zhí)行文件非常大
test.s 比 test 大?100倍左右
靜態(tài)鏈接無法ldd
使用file進行查看,為靜態(tài)鏈接
像shell python 這種腳本語言在linux中可以直接運行
甚至使用chmod+可執(zhí)行權(quán)限就能直接運行