1. 程式人生 > >很多東西學會了可以不用記錄的,記錄的都是寂寞罷了

很多東西學會了可以不用記錄的,記錄的都是寂寞罷了

       linux下的程式如許多命令(ls 、echo、cd)要實現他們的功能,需要許多函式,在這些程式的原始碼中,這些函式的來源可以有兩種,一種是自己編寫,另一種是通過呼叫別人已經寫好的函式,自己在編寫程式的時候如果有別人已經寫好的函式,直接呼叫這些函式會提高自己的工作效率,何樂而不為呢。        既然是我們要呼叫別人已經寫好的函式,我們先要了解一下這些函式在哪裡,如何呼叫它們了。linux中人們把預先編譯好的函式集合起來,這些函式都是按照可重用的原則編寫的,用來執行某項常見任務的,比如螢幕處理函式集合(curses集合),說專業點,人們把這樣的函式集合叫函式庫。標準的系統庫檔案一般都儲存在/lib和/usr/lib目錄中,你可以通過ls 命令檢視到這些目錄下有很多字尾為.so 或則.a的檔案,這些檔案就是為我們提供函式的。
      linux 中的函式庫分有兩種:靜態庫和共享庫。可以從庫檔案的字尾區分它們,字尾為.a的代表靜態庫,以.so為字尾的代表共享庫。為了瞭解關於庫,我們下面建立一個靜態庫,然後在程式中使用它。 一、靜態庫 1.建立一個fred.c的檔案在裡面我們寫入如下程式碼: [[email protected]_test_192.168.8.93_61618_A code]# vim fred.c

#include <stdio.h>

void fred(int arg){
        printf("fred:you passed %d \n",arg);
}
2.再建立一個bill.c的檔案,在裡面也寫入一些程式碼
[[email protected]_test_192.168.8.93_61618_A code]# vim bill.c

#include <stdio.h>

void bill(char *arg){
        printf("bill:you passed %s \n",arg);
}
然後分別編譯這兩個函式,產生要包含在庫檔案中的目標檔案 [[email protected]_test_192.168.8.93_61618_A code]# gcc -c bill.c fred.c 這裡gcc通過-c選項來阻止編譯器建立一個完整的程式,如果試圖建立一個完整的程式將不會成功,因為我們還為定義main函式
下面我們開始編寫一個呼叫bill函式的程式。首先,為我們的庫檔案建立一個頭檔案,這個標頭檔案將宣告我們的庫檔案中的函式,它應該被所希望使用我們庫檔案的應用程式所包含。 3.建立lib.h標頭檔案: [[email protected]_test_192.168.8.93_61618_A code]# vim lib.h

void bill(char *);
void fred(int);  4.編寫一個名為program.c的程式,他包含庫的標頭檔案並且呼叫庫中的一個函式 [[email protected]_test_192.168.8.93_61618_A code]# vim program.c

#include "lib.h"

int main()
{
        bill("Hello World");
        return 0;
}
5.我們開始編譯這個程式,我們暫時為編譯器顯示指定目標檔案,然後要求編譯器編譯我們的檔案並將其與預先編譯好的目標模組bill.o連結 [[email protected]_test_192.168.8.93_61618_A code]# gcc -c program.c
[[email protected]_test_192.168.8.93_61618_A code]# gcc -o program program.o bill.o
[[email protected]_test_192.168.8.93_61618_A code]# ./program
bill:you passed Hello World 
6.現在我們建立並使用一個庫檔案,靜態庫檔案也稱作歸檔檔案,都是以.a結尾的,可以通過file命令檢視: [[email protected]_test_192.168.8.93_61618_A code]# file /lib/libdevmapper.a
/lib/libdevmapper.a: current ar archive
建立這樣的靜態庫檔案需要用ar命令,將我們建立好的函式檔案新增進到歸檔檔案(靜態庫檔案)libfoo.a中 [[email protected]_test_192.168.8.93_61618_A code]# ar crv libfoo.a bill.o fred.o 
a - bill.o
a - fred.o
庫檔案建立好了,某些系統可能需要為函式庫生成一個內容表,我們通過ranlib命令來完成這一任務,linux中,如果我們使用GNU的軟體開發工具,這一步是不必需的,但是做了也無妨 [[email protected]_test_192.168.8.93_61618_A code]# ranlib libfoo.a 現在我們的靜態函式庫可以使用了 [[email protected]_test_192.168.8.93_61618_A code]# gcc -o program program.c libfoo.a  [[email protected]_test_192.168.8.93_61618_A code]# ./program
bill:you passed Hello World 也可以使用-l選項來訪問我們的函式庫,但是因為其未儲存到標準位置,所以我們必須要用-L選項來指示編譯器在何處可以找到函式庫 [[email protected]_test_192.168.8.93_61618_A code]# gcc -o program program.c  -L. -lfoo [[email protected]_test_192.168.8.93_61618_A code]# ./program
bill:you passed Hello World 二、共享庫        靜態庫有一個缺點,當我們同時執行許多程式,並且他們都是用來自同一個函式庫的函式時,就會在記憶體中有同一個函式的多份拷貝,在程式檔案自身也有多份同樣的拷貝,將消耗大量寶貴的記憶體和磁碟空間。        linux支援共享庫,它克服了上述不足。共享庫和靜態庫儲存位置是一樣的,檔案字尾不一樣,共享庫是以.so結尾的。與靜態庫不同,程式使用靜態庫的時候,程式本身不會包含函式的程式碼,而是引用執行時可以訪問的共享程式碼。當編譯好的程式被裝載到記憶體中執行時,函式引用被解析併產生對共享庫的呼叫,如果有必要共享庫才被載入到記憶體中。通過這種方法,系統可只保留一份拷貝並供許多程式同時引用,並且在磁碟上也僅保留一份。     我們可以這麼說,引用靜態可庫的程式本身在編譯的時候聯結器會把引用的函式複製到程式中,即程式包含執行所需的所有函式 , 換句話說,它們是“完整的”。因為這一原因,這樣的程式一旦編譯以後,就不依賴任何外部庫就可以運行了。但是共享庫不同,編譯完程式以後,引用過共享庫的程式要正確執行,引用的外部庫一定要存在,否則執行程式必然失敗。     ldd 命令來確定某一特定可執行程式是否引用共享庫。如下 [[email protected]_test_192.168.8.93_61618_A code]# ldd program
        libc.so.6 => /lib64/libc.so.6 (0x0000003485600000)
        /lib64/ld-linux-x86-64.so.2 (0x0000003485200000)
因為我們的靜態函式庫本身又引用了stdio.h,這個標頭檔案使用的printf這個函式是從共享庫/lib64/libc.so.6的引用的,至於還有一個叫/lib64/ld-linux-x86-64.so.2的共享庫,這個後面我們會具體瞭解下它。    我們再來看看,同樣功能的兩個程式,一個可能是引用靜態庫,另外一個引用了共享庫 [[email protected]_test_192.168.8.93_61618_A code]# ldd /sbin/sln
        not a dynamic executable
[[email protected]_test_192.168.8.93_61618_A code]# ldd /bin/ln 
        libc.so.6 => /lib64/libc.so.6 (0x0000003485600000)
        /lib64/ld-linux-x86-64.so.2 (0x0000003485200000)
第一個是一個完整的,不依賴外部庫的程式,通過ldd以後提示不是一個動態連結的可執行程式,後面一個引用了兩個共享庫,我們再來看這兩個程式的大小 [[email protected]_test_192.168.8.93_61618_A code]# ll -h /sbin/sln
-rwxr-xr-x 1 root root 605K Jun  8  2010 /sbin/sln
[[email protected]_test_192.168.8.93_61618_A code]# ll -h /bin/ln  
-rwxr-xr-x 1 root root 32K Mar  1  2010 /bin/ln 很明顯,不引用外部共享庫的要比引用外部共享庫的大10倍左右,這是因為引用共享庫的程式是不完整的程式,它依靠外部共享庫來提供執行所需的許多函式。 三、動態裝入器 如果程式中引用外部共享庫,那麼需要一個動態裝入器(dynamic loader),它負責裝載共享庫並解析客戶程式函式引用,在linux中,這個裝載器是ld.so,也有可能是ld-linux.so.2或者ld-lsb.so.1,它實際上是你在 ln 的 ldd 清單中看到的作為共享庫相關性列出的 ld-linux.so.2 庫。下面我們迅速檢視一下動態裝入器如何在系統上找到適當的共享庫。     動態裝入器找到共享庫要依靠兩個檔案 : /etc/ld.so.conf 和 /etc/ld.so.cache。如果你對 /etc/ld.so.conf 檔案進行 cat 操作,您可能會看到一個與下面類似的清單: [[email protected]_test_192.168.8.93_61618_A code]#  cat /etc/ld.so.conf
include ld.so.conf.d/*.conf [[email protected]_test_192.168.8.93_61618_A code]# cat /etc/ld.so.conf.d/usr_local_lib.conf
/usr/local/lib ld.so.conf 檔案包含一個所有目錄(/lib 和 /usr/lib 除外,它們會自動包含在其中)的清單,動態裝入器將在其中查詢共享庫。但是在動態裝入器能“看到”這一資訊之前,必須將它轉換到 ld.so.cache 檔案中。可以通過執行 ldconfig 命令做到這一點: [[email protected]_test_192.168.8.93_61618_A code]# ldconfig 當 ldconfig 操作結束時,您會有一個最新的 /etc/ld.so.cache 檔案,它反映您對 /etc/ld.so.conf 所做的更改。從這一刻起,動態裝入器在尋找共享庫時會檢視您在 /etc/ld.so.conf 中指定的所有新目錄。 四、ldconfig 技巧 要檢視 ldconfig 可以“看到”的所有共享庫,請輸入: [[email protected]_test_192.168.8.93_61618_A code]#  ldconfig -p | less 413 libs found in cache `/etc/ld.so.cache'         libz.so.1 (libc6,x86-64) => /lib64/libz.so.1
        libz.so.1 (libc6,x86-64) => /usr/lib64/libz.so.1
        libz.so.1 (libc6) => /lib/libz.so.1
        libz.so.1 (libc6) => /usr/lib/libz.so.1
        libz.so (libc6,x86-64) => /lib64/libz.so
        libz.so (libc6,x86-64) => /usr/lib64/libz.so
        libz.so (libc6) => /lib/libz.so
        libz.so (libc6) => /usr/lib/libz.so
        libxml2.so.2 (libc6,x86-64) => /usr/lib64/libxml2.so.2
        libwrap.so.0 (libc6,x86-64) => /lib64/libwrap.so.0
        libwrap.so (libc6,x86-64) => /usr/lib64/libwrap.so
        libvolume_id.so.0 (libc6,x86-64) => /lib64/libvolume_id.so.0
        libuuid.so.1 (libc6,x86-64) => /lib64/libuuid.so.1
        libuuid.so.1 (libc6) => /lib/libuuid.so.1        ..... (還有很多)        還有另一個方便的技巧可以用來配置共享庫路徑。有時候你希望告訴動態裝入器在嘗試任何 /etc/ld.so.conf 路徑以前先嚐試使用特定目錄中的共享庫。在您執行的較舊的應用程式不能與當前安裝的庫版本一起工作的情況下,這會比較方便。要指示動態裝入器首先檢查某個目錄,請將 LD_LIBRARY_PATH 變數設定成您希望搜尋的目錄。多個路徑之間用逗號分隔;例如: [[email protected]_test_192.168.8.93_61618_A code]#  export LD_LIBRARY_PATH="/usr/lib/old:/opt/lib"  匯出 LD_LIBRARY_PATH 後,如有可能,所有從當前 shell 啟動的可執行程式都將使用 /usr/lib/old 或 /opt/lib 中的庫,如果仍不能滿足一些共享庫相關性要求,則轉回到 /etc/ld.so.conf 中指定的庫。

相關推薦

很多東西學會可以不用記錄記錄寂寞罷了

       linux下的程式如許多命令(ls 、echo、cd)要實現他們的功能,需要許多函式,在這些程式的原始碼中,這些函式的來源可以有兩種,一種是自己編寫,另一種是通過呼叫別人已經寫好的函式,自己在編寫程式的時候如果有別人已經寫好的函式,直接呼叫這些函式會提高自己的

Git提交錯不用這三招幫你修改記錄

大家好,今天我們來聊聊git當中一個很重要的功能——歷史記錄的修改。 有的時候我們會突然發現某個地方需要修改,最常見的某個不應該被提交的檔案被提交了進來。我們希望它不只是在後序的版本當中不再出現,而是希望整個從git倉庫當中移除掉。這個時候我們就需要修改git之前的歷史記錄。這個時候應該怎麼辦呢? 不要著急,

當快遞員也學會“跑路”消費者如何捍衛自己的權益?

快遞員近年來,“跑路”成為媒體報端最常見的熱詞之一。P2P網貸平臺、眾籌項目、共享單車、共享汽車……這些都成為“跑路”事件發生的重災區。而幾乎所有的“跑路”無外乎是出於資金鏈斷裂、大撈一筆就走、項目參與者見好就收等原因,但最終傷害的都是大眾切身相關的利益或者權益。低違法成本、毫不負責任的態度等,讓“跑路”成為

為什麽我學會Django/Flask還是不會做Web開發?

box dumps pan 開發網站 white 信號 標簽 查詢 圖片 相信很多朋友或多或少的都嘗試過用Django或者是Flask來開發網站(以下用Django來做代表)。畢竟用Python做開發的速度就已經快人家好幾倍了,何況是基於Python的web框架,那開發一個

學會Python之後所有平臺的電音是強行破解觀看的!

  需要原始碼的小夥伴可以-刀口-裙 735934841獲取哦~              

【Learn Python The Hard Way】學習記錄記錄我覺得值得記錄的一些我遇到的問題

題外話 覺得該學點習的東西怎麼都少不了,這兩天用Python開發ROS的程式深有體會! 所以找這麼一本書進行學!堅持下來!怎麼都得堅持下來!一個月的時間吧!加油加油! 下面這些書中話語自己和自己共勉: 做每一道習題; 一字不差的寫出每一個程式; 讓程式執行起來

【JanelSirry's Blog】百度很多東西但是很多不能用所以需要自己來實踐,作為筆記而記錄方便自己檢視也方便分享喜歡的加關注!

百度統計 [removed] var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.

用到base64轉圖片文件的函數記錄一下

base64 圖片 import java.io.*; import sun.misc.*; //對圖片文件進行Base64編碼 public String getImagebase64(String imgFileName) { byte[] data = null

qq46843大騙子qq我給他做一個網站然後他不掏錢大騙子真實記錄

讀取 道理 ava cep 總結 同步代碼塊 編程 類型 線程 qq46843大騙子qq他叫花總,大騙子!我給他做了一個網站,然後他不掏錢,大騙子真實記錄!qq46843大騙子qq,我給他做了一個網站,然後他不掏錢,大騙子真實記錄!有聊天截圖,真的不要相信,空間都是一些吹牛

學會C語言可以開發出很多東西嗎?

dac 是你 ping 動態 方法 快速實現 別人 b2c 高級語言 C語言相比其他高級語言,就像內功和劍法一樣。只會C語言可能並不能寫出一個看起來就很厲害的程序,但C語言是你學好其他一切語言的基礎。有了C語言的底子,再學別的語言就很容易上手了。你能想到的,C語言都能搞,可

我也不知道這算不算bug單純記錄沒別的意思圖片是上傳在慕課網的所以預覽不。。0.0

。。 https ref 讓我 chrom ron 允許 error 個人 無意發現慕課網修改個人簽名功能性bug 修改個人簽名失敗的問題 圖片 經過測試,像這樣兩行文字中間有換行的話,保存會提示error,如圖: 圖片 而如果不換行,就能成功: 圖片 圖片 瀏覽器用的Ch

用別人的錢和時間進行學習(可以學到很多東西創業成功多把握而且緩解財務壓力)善於利用已有資源別著急只要不斷工作、不斷學習然後保持耐心即可

strong 以及 禮品 body tor 是我 雜誌 研究 財務 我還是個小孩的時候,曾經在堂兄的禮品店幹過。   那些漫長炎熱的夏天實在是太無聊了,所以我甚至都沒開口讓他給我工錢。   不過有一天我突然想到了一個好點子。我可以跑到山裏面,到當地果園摘一些無花果,

[實戰]我們爬取20W條淘寶銷售記錄只為了知道哪種月餅更受歡迎!

引言 中秋佳節我們要吃傳統美食——月餅。小編忽然間有個想法,想要知道在淘寶上哪種月餅更受歡迎。說幹就幹,立馬操練起來~   需求分析 通過爬取淘寶散裝月餅銷售記錄,對使用者購買過的月餅進行統計,分析最受歡迎的月餅種類。由於搜尋關鍵字“月餅”會出現很多套裝禮盒,影響我們的判斷

大自然是神奇的有許多未知的想不通的東西記錄

比如好多的“為什麼” 宇宙無限大,宇宙之外是什麼? 比如物質可以無限小,小到什麼時候是個終點呢。   科學家發明了好多的定律,但是隻知道是定律,那麼用就行了,比如萬有引力定律,是那規律, 可是物體為什麼會相互吸引呢? 世界上為什麼會存在物質呢,他們從哪裡來的呢。

【py vs oracle_utl_file】oracle直接後臺匯出csv的速度大概2萬條記錄檔案5M用時16秒但是1600萬檔案4G4小時

CREATE OR REPLACE PROCEDURE SQL_TO_CSV (  P_QUERY IN VARCHAR2, -- PLSQL文  P_DIR IN VARCHAR2, -- 匯出的檔案放置目錄  P_FILENAME IN VARCHAR2 --

一些自己會但是不怎麼精通的程式語言和知識做個記錄空餘時間加強學習

程式語言: C, C++, VB, VBA, Java, Python 前端基礎: HTML5, CSS3, JavaScript, TypeScript, AngularJs, Vue 程式設計知識: 資料結構與演算法  離散數學  概率論  正則

是從哪裡弄來的麵筋記錄一下

生活從來沒有準備到完美的時候,計劃永遠都趕不上變化,那麼校招也是一樣,你永遠不會有準備好的那一天,那就在準備了多少就直接上戰場吧。   學習時間: (1) 2018.5.15 - 2018.6.15 正式複習開始了,在這段時間裡,開始大量複習計算機網路、Linux、資料庫(My

剛剛遇到的幾道題感覺自己還是有很多的知識點不清楚記錄

第一道 var myObject = { foo: "bar", func: function() { var self = this; console.log(this.foo);   console.log(self.foo);   (function(

多遍博文采取幾遍結合記錄一下Win7下Python與Tensorflow-CPU版開發環境的安裝與配置過程

以此文記錄Python與Tensorflow及其開發環境的安裝與配置過程,以備以後參考。 1 硬體與系統條件 Win7 64位系統,顯示卡為NVIDIA GeforeGT 635M 2 安裝策略 a.由於以上原因,選擇在win7下安裝cpu版的tensorflow

電腦C盤容量不夠用怎麼辦?學會這一招再也不用重安新系統

作為一個生活在網際網路時代的一員,怎麼可能沒有電腦的存在了?隨著電腦使用的時間變化,電腦中的C盤容量也會越來越大,有時C盤分的太小,就會感覺電腦明顯的變慢了,對電腦高手來說,這些都是小問題,但對於小白來說,卻是束手無策,拿到店裡又浪費錢,那該怎麼辦了?不用擔心,今天小編就來教