-E 預(yù)處理指定源文件
-S 編譯指定源文件
-c 匯編指定源文件
-o 生成可執(zhí)行文件
-I directory 指定Include包含文件的搜索目錄
-g 編譯的時候生成調(diào)試信息
-D 在程序編譯時指定一個宏
-w 不生成任何的警告信息
-Wall 生成所有警告
-On n:0~3;表示編譯器的優(yōu)化選項級別 O0 - 不優(yōu)化;O1 - 缺省值;O3 - 優(yōu)化級別最高
-l 編譯時指定庫
-L 編譯時指定庫的路徑
-fpic 生成與位置無關(guān)的代碼
-shared 生成共享目標(biāo)文件
-std 指定方言 -std=c++11
gcc編譯.c;g++編譯.cpp即可
在編譯階段g++會自動調(diào)用gcc 二者等價
靜態(tài)庫的制作
庫的好處:代碼保密;方便部署和分發(fā);
靜態(tài)庫:在程序的鏈接階段被復(fù)制到程序中
命名規(guī)則:linux-libxxx.a;windows-libxxx.lib;lib為前綴,xxx為庫名
制作步驟:
1. gcc獲得.o文件
2. .o文件用ar工具打包? ar rcs libxxx.a xxx.o xxx.o
?靜態(tài)庫的使用
gcc main.c -o app -I ./include/ -l calc -L ./lib;-I 提供頭文件目錄,-L 指定庫的路徑,-l 庫的名稱
?
動態(tài)庫的制作與使用
動態(tài)庫:在鏈接階段沒有復(fù)制到程序中,而是程序在運(yùn)行時由系統(tǒng)動態(tài)加載到內(nèi)存中供程序調(diào)用
命名規(guī)則:linux - libxxx.so;windows - libxxx.dll;
制作流程:
1. gcc得到.o文件,生成和位置無關(guān)的代碼(-fpic)
2. gcc得到動態(tài)庫(-shared)
?動態(tài)庫加載失敗的原因:程序啟動時,動態(tài)庫被動態(tài)加載到內(nèi)存中(使用到動態(tài)庫中的API時才會加載)。需要ldd檢查動態(tài)庫依賴關(guān)系
?需要系統(tǒng)的動態(tài)載入器(ld-linux.so)來獲取所依賴庫的絕對路徑,先檢查虛擬地址空間、LD_LIBRARY_PATH、/etc/ld.so.cache、/lib/(/user/lib)將動態(tài)庫加載到內(nèi)存中;
解決辦法:在動態(tài)載入器查找范圍內(nèi),加入動態(tài)庫即可。
eg. 配置環(huán)境變量(LD_LIBRARY_PATH)
?但配置的環(huán)境變量是臨時了,新開中斷沒有。永久配置環(huán)境變量的方法:1. 用戶級別;2. 系統(tǒng)級別
用戶級別的配置:在.bashrc中添加上述環(huán)境變量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/nowcoder/linux/lesson06/library/lib
. .bashrc更新即可;
系統(tǒng)級別的配置:sudo vim/etc/profile
eg. 配置文件列表
通過添加庫絕對路徑在/etc/ld/so/conf;sudo ldconfig更新即可
eg. 將動態(tài)庫文件放置在/lib/(/user/lib)下(不建議,可能會替換系統(tǒng)本身的文件)
靜態(tài)庫的優(yōu)缺點(diǎn)
+ 靜態(tài)庫被打包到應(yīng)用程序中加載速度快
+ 發(fā)布程序無需提供靜態(tài)庫,移植方便
- 消耗系統(tǒng)資源、更新內(nèi)存
- 更新、部署、發(fā)布麻煩
動態(tài)庫的優(yōu)缺點(diǎn)
+ 進(jìn)程間資源共享(共享庫)
+ 更新、部署、發(fā)布簡單
+ 可控制加載動態(tài)庫的時間
- 加載速度慢文章來源:http://www.zghlxwxcb.cn/news/detail-677668.html
- 發(fā)布程序需要提供依賴的動態(tài)庫文章來源地址http://www.zghlxwxcb.cn/news/detail-677668.html
到了這里,關(guān)于linux并發(fā)服務(wù)器 —— 動態(tài)庫和靜態(tài)庫實戰(zhàn)(一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!