linux下如何編寫動(dòng)態(tài)鏈接庫 linux下擴(kuò)展名為.o和.so的文件分別是什么?
linux下擴(kuò)展名為.o和.so的文件分別是什么?反正叫什么名字,都沒所謂的只不過明確的習(xí)慣,.o是編譯器的中間目標(biāo)文件將多個(gè)中間目標(biāo)文件,可以鏈接成可執(zhí)行文件.so文件表示動(dòng)態(tài)鏈接庫linux下C開
linux下擴(kuò)展名為.o和.so的文件分別是什么?
反正叫什么名字,都沒所謂的只不過明確的習(xí)慣,.o是編譯器的中間目標(biāo)文件將多個(gè)中間目標(biāo)文件,可以鏈接成可執(zhí)行文件.so文件表示動(dòng)態(tài)鏈接庫
linux下C開發(fā)用什么開發(fā)工具?
linux就像你不集成主板開發(fā)黃靜,像windows下的vsdevc等集成開發(fā)工具
比起windows,linux編輯器編譯器等是獨(dú)立的,因此是可以先用vim編輯器寫一段ccjava等代碼然后把按照gccg各對c文件和cpp文件通過編譯器,這樣的就可以不編譯器成可執(zhí)行文件,也可以動(dòng)態(tài)鏈接庫等等
所以linux開發(fā)大多數(shù)是用命令來不能執(zhí)行不能操作的,也就是linux也是命令
如何正確的使用靜態(tài)鏈接庫和動(dòng)態(tài)鏈接庫?
動(dòng)態(tài)庫和靜態(tài)庫
在Win下,閃圖庫以.dll結(jié)尾,靜態(tài)庫以.lib結(jié)尾。
在Linux下,動(dòng)態(tài)庫文件以.so結(jié)尾,動(dòng)態(tài)和靜態(tài)庫以.a結(jié)尾。
在Mac下,代碼庫以.dylib結(jié)尾,動(dòng)態(tài)和靜態(tài)庫以.a結(jié)尾。
日志庫的優(yōu)勢和劣勢
日志函數(shù)庫在編譯的時(shí)候并沒有被程序編譯進(jìn)目標(biāo)代碼中,你的程序負(fù)責(zé)執(zhí)行到咨詢函數(shù)時(shí)才全局函數(shù)該函數(shù)庫里的相應(yīng)函數(shù),因此動(dòng)態(tài)函數(shù)庫所出現(xiàn)的可執(zhí)行文件也很小。的原因函數(shù)庫還沒有被整合起來進(jìn)你的程序,反而程序運(yùn)行時(shí)代碼的申請并動(dòng)態(tài)創(chuàng)建,因此程序的運(yùn)行環(huán)境中必須需要提供相對應(yīng)的庫。閃圖函數(shù)庫的改變的確影響不大你的程序,因?yàn)殚W圖函數(shù)庫的升級都很更方便。
某個(gè)程序在運(yùn)行時(shí)要?jiǎng)討B(tài)創(chuàng)建某個(gè)代碼鏈接庫函數(shù)的時(shí)候,OS是需要查看所有正在運(yùn)行的進(jìn)程,找找看是否是也有人虛擬光盤了這個(gè)庫。如果沒有有的話,再用。要是沒有才會(huì)虛擬光盤。這樣的第一個(gè)優(yōu)點(diǎn)那是浪費(fèi)內(nèi)存空間。動(dòng)態(tài)分配到換句話說是等是需要的時(shí)候才轉(zhuǎn)業(yè)內(nèi)存,而又不是不好使你不都要先扔到內(nèi)存里來。
我如果不是打算生級某個(gè)軟件。如果可以升級的位置是在dll里,那軟件其他的部位不需要新的編譯程序鏈接。因?yàn)樵趺瓷壏奖惆 ?/p>
動(dòng)態(tài)和靜態(tài)庫的優(yōu)勢和劣勢
用來靜態(tài)函數(shù)庫程序編譯成的文件比較大,而且整個(gè)函數(shù)庫在編譯時(shí)都會(huì)被整合進(jìn)目標(biāo)代碼中,他的優(yōu)點(diǎn)就顯而易見了,即程序編譯后的執(zhí)行程序不需要外部的函數(shù)庫支持,只不過所有使用的函數(shù)都早被編譯出來了。不過這也會(huì)下一界他的缺點(diǎn),只不過如果沒有你靜態(tài)動(dòng)態(tài)鏈接的函數(shù)庫改變了,那就你的程序需要新的編譯。
代碼更精簡,是因?yàn)椴槐刈霭姹緳z查。
程序分發(fā)時(shí)文件個(gè)數(shù)少,是因?yàn)橹С朱o態(tài)鏈接到源文件里了。
只編譯程序從里面出來庫中所帶的部分,而不需要整個(gè)庫。
生成沉淀的binary占空間更大。
重復(fù)的庫可能會(huì)出現(xiàn)在多個(gè)進(jìn)程,浪費(fèi)內(nèi)存。
庫內(nèi)部可以更新的話需要然后再編譯器binary。
Linu臺(tái)的動(dòng)態(tài)和靜態(tài)庫
動(dòng)態(tài)和靜態(tài)庫的生成
動(dòng)態(tài)和靜態(tài)庫的鏈接
Linu臺(tái)的動(dòng)態(tài)庫
日志庫的生成
動(dòng)態(tài)庫的鏈接
Windows平臺(tái)的靜態(tài)動(dòng)態(tài)庫
動(dòng)態(tài)和靜態(tài)庫的生成/MT在用編譯器以創(chuàng)建家族多線程可執(zhí)行文件。生成氣體支持靜態(tài)庫lib。
靜態(tài)庫的鏈接1、在建議使用鏈接庫的代碼開頭加入到,第二行是要?jiǎng)討B(tài)鏈接庫的鏈接庫里的函數(shù):
2、也將內(nèi)部函數(shù)的鏈接庫的lib放入后項(xiàng)目源代碼中,接著編譯。(編譯程序的時(shí)候不需要dll。這里把支持靜態(tài)部分lib編譯進(jìn)了exe,但日志庫dll還沒用。)
3、正常運(yùn)行之前要把dll扔到exe目錄下。
Windows平臺(tái)的動(dòng)態(tài)庫
日志庫的生成/md在用編譯器以創(chuàng)建多線程DLL。生成動(dòng)態(tài)庫。
動(dòng)態(tài)庫的鏈接1、LoadLibrary(或MFC的AfxLoadLibrary),停泊動(dòng)態(tài)庫。
2、GetProcAddress,聲望兌換要分解重組的函數(shù),將符號(hào)名或標(biāo)志號(hào)裝換為DLL內(nèi)部地址。
3、FreeLibrary(或MFC的AfxFreeLibrary),釋放動(dòng)態(tài)鏈接庫。