當前位置:首頁 » 操作系統 » linux靜態鏈接庫

linux靜態鏈接庫

發布時間: 2022-03-02 13:15:37

linux下 c++類可以編譯成靜態鏈接庫么

linux有個規定.
庫要用lib開頭
所以你編譯時要在前面加個lib
gcc -c lib.cpp ---->生成 lib.o

ar cqs liblib.a lib.o ---->生成liblib.o 用的時候只要llib就行了

gcc test.cpp -o test -static -L . -llib 這樣子就可以編譯通過啦

② Linux編譯靜態鏈接庫出現如圖錯誤,求救!

1.
只表明
庫文件
路徑,未說明庫文件名稱。選項再加一條
-l
count
2.
庫文件命名錯誤,應該為"libxxx.a"(靜態庫),此處名稱應為libcount.a
3.
重要:記得不清了,可能我上面說的都是錯的!!!

③ linux 動態鏈接和靜態鏈接的區別

兩者區別:a,靜態庫的使用需要:1包含一個對應的頭文件告知編譯器lib文件裡面的具體內容2設置lib文件允許編譯器去查找已經編譯好的二進制代碼b,動態庫的使用:程序運行時需要載入動態庫,對動態庫有依賴性,需要手動加入動態庫c,依賴性:靜態鏈接表示靜態性,在編譯鏈接之後,lib庫中需要的資源已經在可執行程序中了,也就是靜態存在,沒有依賴性了動態,就是實時性,在運行的時候載入需要的資源,那麼必須在運行的時候提供需要的動態庫,有依賴性,運行時候沒有找到庫就不能運行了d,區別:簡單講,靜態庫就是直接將需要的代碼連接進可執行程序;動態庫就是在需要調用其中的函數時,根據函數映射表找到該函數然後調入堆棧執行。做成靜態庫可執行文件本身比較大,但不必附帶動態庫做成動態庫可執行文件本身比較小,但需要附帶動態庫鏈接靜態庫,編譯的可執行文件比較大,當然可以用strip命令精簡一下(如:striplibtest.a),但還是要比鏈接動態庫的可執行文件大。程序運行時間速度稍微快一點。靜態庫是程序運行的時候已經調入內存,不管有沒有調用,都會在內存里頭。靜態庫在程序編譯時會被連接到目標代碼中,程序運行時將不再需要該靜態庫。其在編譯程序時若鏈接,程序運行時會在系統指定的路徑下搜索,然後導入內存,程序一般執行時間稍微長一點,但編譯的可執行文件比較小;動態庫是程序運行的時候需要調用的時候才裝入內存,不需要的時候是不會裝入內存的。動態庫在程序編譯時並不會被連接到目標代碼中,而是在程序運行是才被載入,因此在程序運行時還需要動態庫存在。動態鏈接庫的特點與優勢首先讓我們來看一下,把庫函數推遲到程序運行時期載入的好處:1.可以實現進程之間的資源共享。什麼概念呢?就是說,某個程序的在運行中要調用某個動態鏈接庫函數的時候,操作系統首先會查看所有正在運行的程序,看在內存里是否已有此庫函數的拷貝了。如果有,則讓其共享那一個拷貝;只有沒有才鏈接載入。這樣的模式雖然會帶來一些「動態鏈接」額外的開銷,卻大大的節省了系統的內存資源。C的標准庫就是動態鏈接庫,也就是說系統中所有運行的程序共享著同一個C標准庫的代碼段。2.將一些程序升級變得簡單。用戶只需要升級動態鏈接庫,而無需重新編譯鏈接其他原有的代碼就可以完成整個程序的升級。Windows就是一個很好的例子。3.甚至可以真正坐到鏈接載入完全由程序員在程序代碼中控制。程序員在編寫程序的時候,可以明確的指明什麼時候或者什麼情況下,鏈接載入哪個動態鏈接庫函數。你可以有一個相當大的軟體,但每次運行的時候,由於不同的操作需求,只有一小部分程序被載入內存。所有的函數本著「有需求才調入」的原則,於是大大節省了系統資源。比如現在的軟體通常都能打開若干種不同類型的文件,這些讀寫操作通常都用動態鏈接庫來實現。在一次運行當中,一般只有一種類型的文件將會被打開。所以直到程序知道文件的類型以後再載入相應的讀寫函數,而不是一開始就將所有的讀寫函數都載入,然後才發覺在整個程序中根本沒有用到它們。靜態庫:在編譯的時候載入生成目標文件,在運行時不用載入庫,在運行時對庫沒有依賴性。動態庫:在目標文件運行時載入,手動載入,且對庫有依賴性。具體在開發中用到哪種庫,我覺得還是根據實際的內存大小,ROM大小,運行的速度等綜合考慮。

④ linux下的靜態庫創建與查看,及如何查看某個可執行依賴於哪些動態庫

創建靜態庫:
ar -rcs test.a *.o
查看靜態庫:
ar -tv test.a
解壓靜態庫:
ar -x test.a

查看程序依賴的動態庫:
readelf -a xxx|grep library
如:可以看到,下面的交叉程序hello執行依賴於如下兩個動態庫。
rebi@ubuntu:~/test$ arm-none-linux-gnueabi-readelf -a hello|grep "library"
0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED) Shared library: [libc.so.6]
rebi@ubuntu:~/test$

或者:readelf -l hello 即可。

nm xxx 查看符號
其中,T表示代碼段,U表示在其它地方定義,所以需要確保必須在某個.o或庫里被定義過。

⑤ linux下c++動態鏈接庫和靜態鏈接庫有何區別

根據鏈接時期的不同,庫又有:靜態庫和共享庫(動態庫) 二者的不同點在於代碼被載入的時刻不同 靜態庫的代碼在編譯過程中已經被載入可執行程序,因此體積較大 共享庫的代碼是在可執行程序運行時才載入內存的,在編譯過程中僅簡單的引用,

⑥ linux把幾個靜態庫鏈接進目標文件中

靜態庫不能被打包到.o 文件
在C編譯中, 是.c編譯成.o,然後若干個.o打包成.a
.a要比.o高一級的。 所以不能產生新的.o
你可以把.a文件解開 成為.o集合
加上你的.o文件, 共同打包成一個新的.a文件
這樣是可行的。

⑦ linux 把動態庫(libxxx.so)進行靜態鏈接

不行的。要靜態鏈接就要使用靜態庫(libxxx.a).

⑧ linux怎樣實現c語言動態庫與靜態庫的鏈接

Linux系統中靜態庫是.a文件,編譯鏈接.a文件只需要加上.a文件的完整的文件路徑就可以了,比如:
gcc
-o
hello
hello.c
/usr/lib/libm.a
Linux系統的動態庫是系統中的.so文件,編譯鏈接動態庫需要用-L參數指定動態庫的搜索路徑,還要用-l(這個是小寫的L)指定動態庫的名字,比如:
gcc
-o
hello
hello.c
-L/usr/openssl/lib
-lcrypto

⑨ linux 怎麼指定靜態鏈接靜態庫

創建靜態庫: ar -rcs test.a *.o 查看靜態庫: ar -tv test.a 解壓靜態庫: ar -x test.a 查看程序依賴的動態庫: readelf -a xxx|grep library 如:可以看到,下面的交叉程序hello執行依賴於如下兩個動態庫。 rebi@ubuntu:~/test$ arm-none-li...

⑩ Linux下載入靜態鏈接庫

dll文件,貌似是windows下的動態鏈接庫,屬於pe文件。linux下怎麼可能載入那種東西呢。

熱點內容
怎麼給安卓升級 發布:2024-09-23 07:09:23 瀏覽:244
人類編譯器哪個好 發布:2024-09-23 06:52:24 瀏覽:622
安卓刪掉的照片怎麼恢復 發布:2024-09-23 06:41:04 瀏覽:158
上傳1080p視頻騰訊 發布:2024-09-23 06:36:24 瀏覽:927
光遇安卓國服是從什麼季節開始 發布:2024-09-23 06:34:56 瀏覽:490
安卓如何投屏賓士 發布:2024-09-23 06:25:25 瀏覽:464
win伺服器轉發ip 發布:2024-09-23 06:15:27 瀏覽:571
macbook照片怎麼放入安卓 發布:2024-09-23 06:03:08 瀏覽:407
關系型資料庫的原理 發布:2024-09-23 05:58:34 瀏覽:577
商城模板html源碼 發布:2024-09-23 05:58:31 瀏覽:343