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