實習日記(5 9)動態鏈結庫

2021-10-05 21:55:46 字數 2396 閱讀 2281

今天先搞一下cjson庫,了解一下c庫的引入

這裡有一篇講靜態鏈結庫和動態鏈結庫的部落格:

[root@loalhost lishuai]

#gcc test1.c test2.c test3.c -shared -o libtest.so //這是主要的

[root@loalhost lishuai]

#ls //ls是顯示檔案,類似dir

[root@loalhost lishuai]

#test1.c test2.c test3.c test.h libtest.so

注釋:

<1> -shared : 建立動態函式庫

libtest.so : 這是動態函式庫名所規定的書寫格式.以"lib"開頭,以"so"結尾,中間是動態函式庫名.

<2> 製作動態函式庫時,不需要加上標頭檔案,即:

不能寫成:gcc test1.c test2.c test3.c test.h -shared -o libtest.so

<3> 製作動態鏈結庫時,gcc不需要引數-l、-l、-i,這些引數只是在鏈結函式庫時才使用,而不是在製作函式庫時使用

具體方法還是需要翻看上面的部落格,也就是:

gcc test1.c -shared -o libtest.so
執行完後生成了乙個libtest.so

生成了乙個test可執行檔案:

執行報錯:

大致是有關檔案路徑的緣故

注釋:gcc的編譯選項

-i 首個查詢:目錄作為第乙個尋找標頭檔案的目錄

-l 路徑 :指定額外的庫函式搜尋路徑dir,因此-l./表示指定函式庫的路徑為當前路徑

-l 函式庫名 :指定鏈結時需要的其它函式庫,這裡特別注意的是l後跟函式庫的名字,即test,而不是libtest.so

按照這個部落格做的落地成功:

還有這篇:

我在usr\local\lzl\usr\local下新建了乙個bin資料夾,且執行了下面的命令:

export ld_library_path=/usr/local/lzl/usr/local/lib:$ld_library_path
解析:

如果共享庫檔案安裝到了其它"非/lib或/usr/lib" 目錄下, 但是又不想在/etc/ld.so.conf中加路徑(或者是沒有許可權加路徑). 那可以export乙個全域性變數ld_library_path, 然後執行程式的時候就會去這個目錄中找共享庫.

ld_library_path的意思是告訴loader在哪些目錄中可以找到共享庫. 可以設定多個搜尋目錄, 這些目錄之間用冒號分隔開. 比如安裝了乙個mysql到/usr/local/mysql目錄下, 其中有一大堆庫檔案在/usr/local/mysql/lib下面, 則可以在.bashrc或.bash_profile或shell裡加入以下語句即可:

export ld_library_path=/usr/local/mysql/lib:$ld_library_path

照最開始的部落格講的在使用了 -l./ 後應該是不需要再進行這些操作了啊,還是不行,只能這樣成功,雖然部落格中說這個是臨時方案,我先這樣用吧,後期再問問大佬。

這樣的話動態鏈結庫算是跑起來乙個小demo,下面整合一下cjson鏈結庫

我直接在usr/lib下生成了libcjson.so檔案,編譯成功

我又將usr/lib下的libcjson.so刪除,在與執行檔案同一級的新建了乙個libcjson.so,編譯成功

使用的是

gcc hello.c -l.

/-lcjson -o hello

一篇特別棒的部落格:建議反覆閱讀

暫存器進行資訊儲存;暫存器是cpu中與程式設計師可以用指令讀寫的部件,不同的cpu,暫存器的個數、結構是不相同的。

這裡有一篇記憶體和暫存器橫向比較的部落格:

暫存器是cpu的組成部分,因為在cpu內,所以cpu對其讀寫速度是最快的,不需要io傳輸,

但同時也決定了此類暫存器數量非常有限,有限到幾乎每個儲存都有自己的名字,而且有些還有多個名字。

動態鏈結庫 靜態鏈結庫

包含標頭檔案和庫 idir 指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例 gcc test.c i.inc o test。ldir 指定鏈結時查詢lib的目錄,常用於查詢第三方庫。llibrary 指定額外鏈結的lib庫 巨集定義 dmacro 以字串 1 預設值 定義 macro...

靜態鏈結庫 動態鏈結庫

庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll ...

靜態鏈結庫,動態鏈結庫

關於靜態鏈結庫,參考如下博文 當你完成了 開發,想把這個 給別人用,但是又不希望別人看到原始碼,就要給別人乙個庫和標頭檔案,庫和標頭檔案是配合的,缺一不可。或者過程相反,你從別人那裡拿到乙個庫和標頭檔案來使用。那麼如何編譯生成乙個庫給他人,如何使用從他人那裡拿到的庫呢?範例1 我們想把linuxfr...