UC環境編程一-----------------編程環境

1.Unix族譜
在這裏插入圖片描述
2.GUN工程:基本原則就是共享,其主旨在於發展一個有別於一切商業Unix的,免費且完整的類Unit系統。
3.POSIX標準:統一的系統編程接口規範。
4.GPL通用公共許可證
5.構建過程:
1)編輯 vi hello.c->hello.c
2)預編譯 gcc -E hello.c->hello.i
3)編譯 gcc -s hello.i->hello.s
4)彙編 gcc -c hello.s->hello.o
5)鏈接 gcc hello.o ->a.out

6.編譯單個源程序
gcc [選項] 文件
-c 只編譯不鏈接
-o 指定輸出文件
-E 預編譯
-s 產生彙編文件
-pedantic 對不符合ANSI/ISO c標準的拓展語法產生錯誤
-Wall 產生儘可能多的警告
-Werror 將警告作爲錯誤處理
-x 指定語言
-g 產生調試信息
7.頭文件作用:
(1)聲明外部變量、函數和類
(2)定義宏,類型別名和自定義類型
(3)包含其他頭文件
(4)藉助頭文件衛士防止頭文件多次被包含而引發重定義的錯誤
8.gcc -I 指定頭文件搜索附加路徑
9.預處理指令
##連接宏內兩個連續的字符串
#將宏參數擴展成字符串字面值
#error 產生錯誤
#warning 產生警告
#pragma GCC dependency <文件> 檢查文件依賴關係
#pragma GCC poison <標識> 使標識產生錯誤
#pragma pack(1/2/4/8) 按指定字節補齊對齊
#line 指定行號
10預定義宏

1.BASE_FILE // 正在編譯的源文件名
2.FILE // 所在文件名
3.LINE // 行號
4.FUNCTION // 函數名
5.func // 同__FUNCTION__
6.DATE // 日期
7.TIME // 時間
8.INCLUDE_LEVEL // 包含層數,從0開始
9.__cplusplus // C++編譯器將其定義爲1,
// C編譯器不定義該宏

11環境變量
C_INCLUDE_PATH - C頭文件的附加搜索路徑,相當於gcc的-I選項
CPATH - 同C_INCLUDE_PATH
CPLUS_INCLUDE_PATH - C++頭文件的附加搜索路徑
LIBRARY_PATH - 鏈接時查找靜態庫/共享庫的路徑
LD_LIBRARY_PATH - 運行時查找共享庫的路徑
12庫
(1)鏈接靜態庫是將庫中的被調用代碼複製到調用模塊中,而鏈接共享庫是在調用模塊中嵌入被調用代碼在庫中的相對地址
(2)靜態庫佔空間,但是效率高,共享庫佔用空間小,易於修改但是效率略低
(3)靜態庫拓展名.a,共享庫的缺省拓展名.so
13.創建靜態庫
(1)編輯源程序 .c/.h
(2)編譯成目標文件 gcc -c xxx.c ->xxx.o
(3)打包成靜態庫文件 ar -r libxxx.a xxx.o

•ar指令:ar [選項] 靜態庫文件名 目標文件列表
-r - 將目標文件插入到靜態庫中,已存在則更新
-q - 將目標文件追加到靜態庫尾
-d - 從靜態庫中刪除目標文件
-t - 列表顯示靜態庫中的目標文件
-x - 將靜態庫展開爲目標文件
14.調用靜態庫
(1)直接調用 gcc main.c libxxx.a
(2)通過LIBRARY_PATH環境變量指定庫路徑
export LIBRARY_PATH=$LIBRARY_PATH:./
gcc main.c -l庫名
(3)通過gcc -L 選項指定庫路徑
gcc main.c -l庫名 -L路徑
15.可執行文件在運行階段不依賴靜態庫
16.創建共享庫
•1) 編輯源程序:.c/.h
•2) 編譯成目標文件:gcc -c -fpic xxx.c -> xxx.o
•3) 鏈接成共享庫文件:gcc -shared xxx.o … -o libxxx.so
17.調用共享庫同靜態庫
18.運行可執行文件時依賴共享庫
所以需要添加運行路徑
運行時需要保證LD_LIBRARY_PATH,環境變量中包含共享庫所在的路徑。
19.動態加載共享庫
(1)加載共享庫
void *dlopen(const char *filename,int flag);
成功返回共享庫句柄,失敗返回NULL
(2)獲取函數地址
void *dlsym(void *handle,const char *symbol)
成功返回函數地址
(3)卸載共享庫
int dlclose(void *handle);
成功返回0,失敗返回非零
(4)獲取錯誤信息
char *dlerror(void);

記得鏈接時需要 -ldl
20.輔助命令
nm:產看目標文件,可執行文件,靜態庫共享庫中的符號列表
ldd,查看可執行文件和共享庫的動態依賴
strip:減肥
objdump:顯示二進制模塊中的反彙編信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章