欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
C 程序編譯之謎(二)——隱藏源碼,動(dòng)態(tài)和靜態(tài)鏈接庫的秘密

前面我們提到了如果我們不希望把我們的源碼提供出來(lái),但是又想提供這個(gè)接口給調用者調用,那么這個(gè)該怎么做呢?

我們可以考慮用靜態(tài)鏈接庫或者動(dòng)態(tài)鏈接庫。

1、鏈接庫

那么什么叫鏈接庫呢?說(shuō)白了,就是一個(gè)二進(jìn)制文件,是通過(guò)特殊方式生成的一個(gè)二進(jìn)制文件,在鏈接的時(shí)候,可以準確地生成可執行文件。

那么靜態(tài)鏈接庫和動(dòng)態(tài)鏈接庫有什么區別呢?

靜態(tài)鏈接庫在鏈接的時(shí)候程序會(huì )把靜態(tài)鏈接庫中的所有函數插入到你的可執行文件中,在這種鏈接方式下,函數的代碼將從其所在地靜態(tài)鏈接庫中被拷貝到最終的可執行程序中。Linux平臺一般都是.a結尾的文件,像libadd.a這樣,window平臺一般是.lib結尾的文件,像add.lib這樣。

優(yōu)點(diǎn):運行速度比較快

缺點(diǎn):可執行文件的會(huì )比較大

動(dòng)態(tài)鏈接并沒(méi)有說(shuō)把庫文件的代碼插入到可執行文件中,而是在運行的時(shí)候鏈接庫中的函數再加載到可執行文件中,也就是說(shuō)運行的時(shí)候發(fā)現調用的函數是在動(dòng)態(tài)庫中,那么才去巴拉巴拉的加載。Linux平臺一般都是.so結尾的文件,像libadd.so這樣,window平臺一般是.dll結尾的文件,像add.dll這樣。所以很多時(shí)候你在window上安裝軟件,如果你到安裝目錄下查看,可能會(huì )看到很dll結尾的文件,而這些就是第三方的動(dòng)態(tài)庫。

優(yōu)點(diǎn):可執行文件的會(huì )比較小

缺點(diǎn):運行速度比較慢

那么我們如何生成靜態(tài)庫和動(dòng)態(tài)庫,以下生成方法均是在Linux平臺。

2、靜態(tài)鏈接庫

生成靜態(tài)鏈接庫

首先生成.o文件

gcc -c add.cpp -o add.o

或者直接這樣也可以,默認生成的也是.o文件

gcc -c add.cpp

生成靜態(tài)鏈接庫,靜態(tài)庫命名的規則lib+名字+.a

ar rcs libadd.a add.o

生成可執行文件

gcc main.c libadd.a -o maina

maina是利用靜態(tài)庫生成的可執行文件,這個(gè)實(shí)際上是比較簡(jiǎn)單的寫(xiě)法,是頭文件、源文件、鏈接庫都在同一目錄的情況,如果是在不同的目錄的話(huà),就要這樣

gcc main.cpp -Iinclude lib/libadd.a -o maina

簡(jiǎn)化成公式就是以下這樣

gcc + 源文件 + -I頭文件目錄 + lib/libxxx.a + -o 可執行文件名

以上就是利用靜態(tài)鏈接庫生成可執行文件的方法,比較容易理解。ps:實(shí)際上還有另外一種方式生成靜態(tài)庫的,你知道是什么嗎?

3、動(dòng)態(tài)鏈接庫

生成動(dòng)態(tài)鏈接庫

首先生成與位置無(wú)關(guān)的.o文件,-fPIC表示與位置無(wú)關(guān)

gcc -fPIC -c add.cpp -o libadd.o

ps:這邊我也無(wú)法這個(gè)與位置無(wú)關(guān)到底是什么個(gè)意思,因為我用靜態(tài)庫那邊的那個(gè).o文件也可以生成動(dòng)態(tài)庫。

然后生成動(dòng)態(tài)庫

gcc -shared -o libadd.so libadd.o

組后生成可執行文件

gcc main.cpp libadd.so -o mainso

但是運行可執行文件的時(shí)候,可能會(huì )報以下錯誤:

./mainso: error while loading shared libraries: libadd.so: cannot open shared object file: No such file or directory

這個(gè)的意思是找不到動(dòng)態(tài)鏈接庫,解決辦法是修改當前用戶(hù)的.bash_profile文件,添加export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/yourpath,其中yourpath是你動(dòng)態(tài)庫存放的目錄,比如我的是/app/process/alittle,最后執行source .bash_profile讓環(huán)境變量生效。這里要記得一定要另開(kāi)一個(gè)窗口執行,不然還是會(huì )這個(gè)錯誤。

以上就是靜態(tài)庫和動(dòng)態(tài)庫的內容,涉及到了一些編譯過(guò)程的命令,所以后面我會(huì )和大家說(shuō)下程序編譯的相關(guān)過(guò)程。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
mingw64下動(dòng)態(tài)庫和靜態(tài)庫鏈接的真正區別和用法(詳細)_mingw 編譯動(dòng)態(tài)庫
C/C++ 靜態(tài)鏈接庫(.a) 與 動(dòng)態(tài)鏈接庫(.so)
動(dòng)態(tài)庫與靜態(tài)庫
linux靜態(tài)鏈接庫與動(dòng)態(tài)鏈接庫的區別及動(dòng)態(tài)庫的創(chuàng )建
Linux靜態(tài)鏈接(庫)、動(dòng)態(tài)鏈接(庫)、可執行文件加載相關(guān)問(wèn)題(創(chuàng )建、選項、環(huán)境變量等)
gcc/g++ 鏈接庫的編譯與鏈接
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久