中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
(轉載) Linux下的 .o、.a、.so文件說明
工程里很多函數(shù)只是有聲明,找不到實現(xiàn)的代碼。因為那些實現(xiàn)代碼已經編譯成庫所以看不見,我所看見的全是一堆頭文件.

     .o.a、.so文件都是Linux下的程序函數(shù)庫,即編譯好的可以供其他程序使用的代碼和數(shù)據。

優(yōu)點:程序模塊化,容易重新編譯,方便升級。

分類:靜態(tài)函數(shù)庫(對應.a文件)、共享函數(shù)庫(對應.so文件,類似于Windowsdll文件)、動態(tài)加載函數(shù)庫(對應.o文件,相當于Windows里的.obj文件)

 

靜態(tài)函數(shù)庫

特點:實際上是簡單的普通目標文件的集合,在程序執(zhí)行前就加入到目標程序中。

優(yōu)點:可以用以前某些程序兼容;描述簡單;允許程序員把程序link起來而不用重新編譯代碼,節(jié)省了重新編譯代碼的時間(該優(yōu)勢目前已不明顯);開發(fā)者可以對源代碼保密;理論上使用ELF格式的靜態(tài)庫函數(shù)生成的代碼可以比使用共享或動態(tài)函數(shù)庫的程序運行速度快(大概1%-5%

生成:使用ar程序(archiver的縮寫)。ar rcs my_lib.a f1.o f2.o是把目標代碼f1.of2.o加入到my_lib.a這個函數(shù)庫文件中(如果my_lib.a不存在則創(chuàng)建)

使用:gcc生成可執(zhí)行代碼時,使用-l參數(shù)指定要加入的庫函數(shù)。也可以用ld命令的-l-L參數(shù)。

 

共享函數(shù)庫

    共享函數(shù)庫在可執(zhí)行程序啟動的時候加載,所有程序重新運行時都可自動加載共享函數(shù)庫中的函數(shù)。.so文件感覺很復雜,光是命名規(guī)則就已經看得我很暈了~整理一下,共享庫需要:sonamereal name,另外編譯的時候名字也有說法。依次解釋下:

soname必須的格式:lib+函數(shù)庫名+.so+版本號信息(但是記住,非常底層的C庫函數(shù)都不是以lib開頭命名的)。例子:/usr/lib/libreadline.so.3

real name:顧名思義是真正的名字啦,有主版本號和發(fā)行版本號。但是沒找到實例……

編譯器編譯的時候需要的函數(shù)庫的名字就是不包含版本號信息的soname,例如上面的例子把最后的.3去掉就可以了。

位置:共享函數(shù)庫文件必須放在特定目錄,對于開放源碼來說,GNU標準建議所有的函數(shù)庫文件都放在/usr/local/lib目錄下,而且建議命令、可執(zhí)行程序都放在/usr/local/bin目錄下。不過這個只是習慣啦,可以改變,具體的位置信息可以看/etc/ld.so.conf里面的配置信息。當然,也可以修改這個文件,加入自己的一些特殊的路徑要求。

創(chuàng)建:在網上找到了gcc方式和easyeclipse環(huán)境下兩種創(chuàng)建方式。

gcc方式:

    首先創(chuàng)建object文件,這個文件將加入通過gcc –fPIC 參數(shù)命令加入到共享函數(shù)庫里面,標準格式:gcc -shared -Wl,-soname,your_soname -o library_name file_list library_list(說實話這個標準格式看起來好復雜,我找了個實例,但是好像和那個標準格式稍有不同:gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so

easyeclipse環(huán)境下生成.so文件:

        1.選擇新建工程,建立一個c++工程

        2.在工程類型選項里選擇 Shared Library,然后填入工程名字PXXX點擊完成即可。

        3.編寫程序,然后編譯就會在debug或者release里生成一個libPXXX.so文件,如果不要lib的起頭標記點擊project菜單的Properties選項,然后在彈出的界面的右邊點擊Build artifact頁面,將Output prefix選項的內容清空即可。

        4.如果是C++程序,注意在接口函數(shù)的前面加上extern "C"標記,在頭文件加上如下標記:

#ifdef   __cplusplus  

#extern   "C"{  

#endif  

   

頭文件主體  

   

#ifdef   __cplusplus  

 

#endif  

     如果不加以上標記,經過編譯后,so里的函數(shù)名并非你編寫程序時設定的函數(shù)名,在開發(fā)環(huán)境左側的工程文件列表中點開debug項里的PXXX.o可以看到so文件里的函數(shù)名都是在你設定的函數(shù)名后面加了一個__Fi標記,比如你用的設定的函數(shù)名稱是Func(),so里的函數(shù)名則為Func__Fi()或者其他的名稱。

安裝:拷貝共享庫文件到指定的標準的目錄,然后運行ldconfig。如果沒有權限這樣做,那么就只好通過修改環(huán)境變量來實現(xiàn)這些函數(shù)庫的使用了。方法不再說了,很復雜。

查看:可以通過運行ldd來看某個程序使用的共享函數(shù)庫。例如ldd /bin/ls。查看.so文件使用nm命令,如nm libXXX.so。(注意,nm對于靜態(tài)的函數(shù)庫和共享的函數(shù)庫都起作用)

關于覆蓋:如果想用自己的函數(shù)覆蓋某個庫中的一些函數(shù),同時保留該庫中其他的函數(shù)的話,可以在/etc/ld.so.preload中加入要替換的庫(.o結尾的文件),這些preloading的庫函數(shù)將有優(yōu)先加載的權利。

關于更新:每次新增加動態(tài)加載的函數(shù)庫、刪除某個函數(shù)庫或者修改某個函數(shù)庫的路徑時,都要重新運行ldconfig來更新/etc/ld.so.cache

本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
關于Linux靜態(tài)庫和動態(tài)庫的分析 分析 動態(tài) 靜態(tài) 關于 連接 程序 文件 一個 使用 ...
(zz)關于靜態(tài)庫,共享庫,動態(tài)鏈接庫
Linux共享庫、靜態(tài)庫、動態(tài)庫詳解
如何理解Linux中的共享庫?
linux靜態(tài)鏈接庫與動態(tài)鏈接庫的區(qū)別及動態(tài)庫的創(chuàng)建
靜態(tài)庫和動態(tài)庫
更多類似文章 >>
生活服務
熱點新聞
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服