前面我們提到了如果我們不希望把我們的源碼提供出來(lái),但是又想提供這個(gè)接口給調(diào)用者調(diào)用,那么這個(gè)該怎么做呢?
我們可以考慮用靜態(tài)鏈接庫(kù)或者動(dòng)態(tài)鏈接庫(kù) 。
1、鏈接庫(kù) 那么什么叫鏈接庫(kù)呢?說(shuō)白了,就是一個(gè)二進(jìn)制文件,是通過(guò)特殊方式生成的一個(gè)二進(jìn)制文件,在鏈接的時(shí)候,可以準(zhǔn)確地生成可執(zhí)行文件 。
那么靜態(tài)鏈接庫(kù)和動(dòng)態(tài)鏈接庫(kù)有什么區(qū)別呢?
靜態(tài)鏈接庫(kù)在鏈接的時(shí)候程序會(huì)把靜態(tài)鏈接庫(kù)中的所有函數(shù)插入到你的可執(zhí)行文件中,在這種鏈接方式下,函數(shù)的代碼將從其所在地靜態(tài)鏈接庫(kù)中被拷貝到最終的可執(zhí)行程序中 。Linux平臺(tái)一般都是.a結(jié)尾的文件,像libadd.a這樣,window平臺(tái)一般是.lib結(jié)尾的文件,像add.lib這樣 。
優(yōu)點(diǎn):運(yùn)行速度比較快動(dòng)態(tài)鏈接并沒(méi)有說(shuō)把庫(kù)文件的代碼插入到可執(zhí)行文件中,而是在運(yùn)行的時(shí)候鏈接庫(kù)中的函數(shù)再加載到可執(zhí)行文件中,也就是說(shuō)運(yùn)行的時(shí)候發(fā)現(xiàn)調(diào)用的函數(shù)是在動(dòng)態(tài)庫(kù)中,那么才去巴拉巴拉的加載 。Linux平臺(tái)一般都是.so結(jié)尾的文件,像libadd.so這樣,window平臺(tái)一般是.dll結(jié)尾的文件,像add.dll這樣 。所以很多時(shí)候你在window上安裝軟件,如果你到安裝目錄下查看,可能會(huì)看到很dll結(jié)尾的文件,而這些就是第三方的動(dòng)態(tài)庫(kù) 。
缺點(diǎn):可執(zhí)行文件的會(huì)比較大
優(yōu)點(diǎn):可執(zhí)行文件的會(huì)比較小那么我們?nèi)绾紊伸o態(tài)庫(kù)和動(dòng)態(tài)庫(kù),以下生成方法均是在Linux平臺(tái) 。
缺點(diǎn):運(yùn)行速度比較慢

文章插圖
2、靜態(tài)鏈接庫(kù) 生成靜態(tài)鏈接庫(kù)
首先生成.o文件
gcc -c add.cpp -o add.o或者直接這樣也可以,默認(rèn)生成的也是.o文件
gcc -c add.cpp生成靜態(tài)鏈接庫(kù),靜態(tài)庫(kù)命名的規(guī)則lib+名字+.a
ar rcs libadd.a add.o生成可執(zhí)行文件
gcc main.c libadd.a -o mainamaina是利用靜態(tài)庫(kù)生成的可執(zhí)行文件,這個(gè)實(shí)際上是比較簡(jiǎn)單的寫法,是頭文件、源文件、鏈接庫(kù)都在同一目錄的情況,如果是在不同的目錄的話,就要這樣
gcc main.cpp -Iinclude lib/libadd.a -o maina簡(jiǎn)化成公式就是以下這樣
gcc + 源文件 + -I頭文件目錄 + lib/libxxx.a + -o 可執(zhí)行文件名以上就是利用靜態(tài)鏈接庫(kù)生成可執(zhí)行文件的方法,比較容易理解 。ps:實(shí)際上還有另外一種方式生成靜態(tài)庫(kù)的,你知道是什么嗎?
3、動(dòng)態(tài)鏈接庫(kù) 生成動(dòng)態(tài)鏈接庫(kù)
首先生成與位置無(wú)關(guān)的.o文件,-fPIC表示與位置無(wú)關(guān)
gcc -fPIC -c add.cpp -o libadd.ops:這邊我也無(wú)法這個(gè)與位置無(wú)關(guān)到底是什么個(gè)意思,因?yàn)槲矣渺o態(tài)庫(kù)那邊的那個(gè).o文件也可以生成動(dòng)態(tài)庫(kù) 。
然后生成動(dòng)態(tài)庫(kù)
gcc -shared -o libadd.so libadd.o組后生成可執(zhí)行文件
gcc main.cpp libadd.so -o mainso但是運(yùn)行可執(zhí)行文件的時(shí)候,可能會(huì)報(bào)以下錯(cuò)誤:
./mainso: error while loading shared libraries: libadd.so: cannot open shared object file: No such file or directory
這個(gè)的意思是找不到動(dòng)態(tài)鏈接庫(kù),解決辦法是修改當(dāng)前用戶的.bash_profile文件,添加export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/yourpath,其中yourpath是你動(dòng)態(tài)庫(kù)存放的目錄,比如我的是/app/process/alittle,最后執(zhí)行source .bash_profile讓環(huán)境變量生效 。這里要記得一定要另開(kāi)一個(gè)窗口執(zhí)行,不然還是會(huì)這個(gè)錯(cuò)誤 。
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問(wèn)題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專業(yè)人士給予相關(guān)指導(dǎo)!
「愛(ài)刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助:- 減肥套餐怎么搭配 搭配套餐代碼
- 燒烤套餐怎么搭配 搭配套餐代碼
- 牛排套餐搭配 搭配套餐代碼
- 外賣套餐怎么搭配 搭配套餐代碼
- 西餐套餐搭配 搭配套餐代碼
- 營(yíng)養(yǎng)套餐搭配 搭配套餐代碼
- 藍(lán)屏代碼0x0000008e修復(fù)方法 win7藍(lán)屏0x0000008e修復(fù)
- 《仙劍》廠商恐怖新作《女鬼橋:開(kāi)魂路》預(yù)告:學(xué)校遇鬼
- 世界十大恐怖火山 中國(guó)火山
- 密室逃脫恐怖還是鬼屋恐怖
