⑴ 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 動態庫和靜態庫 怎麼鏈接
兩者區別: a,靜態庫的使用需要: 1 包含一個對應的頭文件告知編譯器lib文件裡面的具體內容 2 設置lib文件允許編譯器去查找已經編譯好的二進制代碼 b,動態庫的使用: 程序運行時需要載入動態庫,對動態庫有依賴性,需要手動加入動態庫 c,依賴性: 靜態鏈接表示靜態性,在編譯鏈接之後, lib庫中需要的資源已經在可執行程序中了, 也就是靜態存在,沒有依賴性了 動態,就是實時性,在運行的時候載入需要的資源,那麼必須在運行的時候提供 需要的 動態庫,有依賴性, 運行時候沒有找到庫就不能運行了 d,區別: 簡單講,靜態庫就是直接將需要的代碼連接進可執行程序;動態庫就是在需要調用其中的函數時,根據函數映射表找到該函數然後調入堆棧執行。 做成靜態庫可執行文件本身比較大,但不必附帶動態庫 做成動態庫可執行文件本身比較小,但需要附帶動態庫 鏈接靜態庫,編譯的可執行文件比較大,當然可以用strip命令精簡一下(如:strip libtest.a),但還是要比鏈接動態庫的可執行文件大。程序運行時間速度稍微快一點。 靜態庫是程序運行的時候已經調入內存,不管有沒有調用,都會在內存里頭。靜態庫在程序編譯時會被連接到目標代碼中,程序運行時將不再需要該靜態庫。 其在編譯程序時若鏈接,程序運行時會在系統指定的路徑下搜索,然後導入內存,程序一般執行時間稍微長一點,但編譯的可執行文件比較小;動態庫是程序運行的時候需要調用的時候才裝入內存,不需要的時候是不會裝入內存的。 動態庫在程序編譯時並不會被連接到目標代碼中,而是在程序運行是才被載入,因此在程序運行時還需要動態庫存在。 動態鏈接庫的特點與優勢 首先讓我們來看一下,把庫函數推遲到程序運行時期載入的好處: 1. 可以實現進程之間的資源共享。 什麼概念呢?就是說,某個程序的在運行中要調用某個動態鏈接庫函數的時候,操作系統首先會查看所有正在運行的程序,看在內存里是否已有此庫函數的拷貝了。如果有,則讓其共享那一個拷貝;只有沒有才鏈接載入。這樣的模式雖然會帶來一些「動態鏈接」額外的開銷,卻大大的節省了系統的內存資源。C的標准庫就是動態鏈接庫,也就是說系統中所有運行的程序共享著同一個C標准庫的代碼段。 2. 將一些程序升級變得簡單。用戶只需要升級動態鏈接庫,而無需重新編譯鏈接其他原有的代碼就可以完成整個程序的升級。Windows 就是一個很好的例子。 3. 甚至可以真正坐到鏈接載入完全由程序員在程序代碼中控制。 程序員在編寫程序的時候,可以明確的指明什麼時候或者什麼情況下,鏈接載入哪個動態鏈接庫函數。你可以有一個相當大的軟體,但每次運行的時候,由於不同的操作需求,只有一小部分程序被載入內存。所有的函數本著「有需求才調入」的原則,於是大大節省了系統資源。比如現在的軟體通常都能打開若干種不同類型的文件,這些讀寫操作通常都用動態鏈接庫來實現。在一次運行當中,一般只有一種類型的文件將會被打開。所以直到程序知道文件的類型以後再載入相應的讀寫函數,而不是一開始就將所有的讀寫函數都載入,然後才發覺在整個程序中根本沒有用到它們。 靜態庫:在編譯的時候載入生成目標文件,在運行時不用載入庫,在運行時對庫沒有依賴性。 動態庫:在目標文件運行時載入,手動載入,且對庫有依賴性。 具體在開發中用到哪種庫,我覺得還是根據實際的內存大小,ROM大小,運行的速度等綜合考慮
⑶ 在linux下寫makefile時,如何鏈接一個靜態庫
gcc a1.o a2.o a3.o a4.a a5.a -o canrun.bin
按此格式就可以將很多不管是什麼名字的目標文件鏈接為一個可執行的文件,在運行時在SHELL下輸入:
./canrun.bin就可以運行了。
⑷ Makefile 鏈接靜態庫
Linux的靜態庫是以.a結尾的,要連接靜態庫有兩種方法,一種是在編譯命令最後直接加上庫路徑/庫名稱。
例如你的庫在絕對目錄/lib/libtest.a下面
你就可以這樣來編譯
你可以用-L制定庫的目錄,用-l指定庫的名稱。(是一起用的-L -l)
例如庫的名稱為libtest.a 那麼就用-ltest
註:-ltest要放在-o的後面,不然不會起作用。
詳細可參考: https://blog.csdn.net/u011964923/article/details/73297443
⑸ linux靜態庫鏈接報錯函數undefined
可能原因有,1.庫鏈接的順序有關,被依賴的庫應該在依賴它的庫前面鏈接。makefile里有可能後寫的庫先鏈接,逆序鏈接的。
2.頭文件目錄有多餘的頭文件,裡面聲明的函數找不到定義就會報錯,頭文件刪掉即可解決報錯。
⑹ Linux動態鏈接和靜態鏈接簡析
linux動態鏈接和靜態鏈接簡析1.生成靜態鏈接庫gcc
-c
h.c
-o
h.oar
cqs
libh.a
h.o//ar是生成庫的命令,cqs是參數,libh.a是生成的靜態鏈接庫須以lib開頭,h是庫名,a表示是靜態鏈接庫,h.o是剛才生成目標文件2.生成動態鏈接庫
www.shiwu.com
gcc
-c
h.c
-o
h.o生成動態鏈接庫用gcc來完成gcc
-shared
-WI
-o
libh.so
h.o//-shared
-WI是參數,libh.so是生成的靜態鏈接庫須以lib開頭,h是庫名,so表示是動態鏈接庫,h.o是剛才生成目標文件3.將生成的libh.a,libh.so拷貝到/usr/lib或/lib下4.編譯帶靜態鏈接庫的程序gcc
-c
test.c
-o
test.ogcc
test.o
-o
test
-WI
-Bstatic
-lh//-WI
-Bstatic表示鏈接靜態庫,-lh中-l表示鏈接,h是庫名即/usr/lib下的libh.a5.編譯帶動態鏈接庫的程序gcc
-c
test.c
-o
test.ogcc
test.o
-o
test
-WI
-Bdynamic
-lh//-WI
-Bdynamic表示鏈接動態庫,-lh中-l表示鏈接,h是庫名即/usr/lib下的libh.so6.運行./test得到結果
www.shiwu.com
7.其他知識有些庫形如libh.so.1.0,1.0表示版本號.若要使用該庫,通常要建立一個軟連接,用ln
-s
libh.so.1.0
libh.so.系統不知道1.0為何意思。編譯連接時同時要用動態和靜態鏈接庫,則用如下命令gcc
test.o
-o
test
-WI
-Bstatic
-lh1
-WI
-Bdynamic
-lh28.動態庫和靜態庫的位置問題把動態庫或者靜態庫放在/usr/lib或者/lib下,在鏈接的時候系統會自動到這兩個目錄下尋找。如果沒有放在這兩個目錄下,則修改/etc/ld.so.conf文件,把目錄寫入該文件,然後ldconfig,就OK了。如果沒有放在usr/lib或者/lib目錄下,也不修改/etc/ld.so.conf文件,也可以在編譯的時候加上
-L/路徑
也可以。但是在執行的時候還是會提示找不到庫的所在。
作者
llg521208
⑺ 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把幾個靜態庫鏈接進目標文件中
靜態庫不能被打包到.o 文件
在C編譯中, 是.c編譯成.o,然後若干個.o打包成.a
.a要比.o高一級的。 所以不能產生新的.o
你可以把.a文件解開 成為.o集合
加上你的.o文件, 共同打包成一個新的.a文件
這樣是可行的。
⑽ Linux下的靜態庫和動態庫
靜態庫
可以把它想像成是一些代碼的集合,在可執行程序運行前就已經加到了代碼中,成為了執行程序的一部分,一般是以.a為後綴的文件名,Windows下後綴為.lib。靜態庫的命名也分為三部分,1、前綴:lib,2、庫的名稱:隨意,如lisi,3、後綴:.a。
靜態庫優缺點
上面簡單介紹了靜態庫,那它自然也會有優缺點,這里來介紹下它的優缺點。
優點:1、在最後,函數庫是被打包到應用程序中的,實現函數本地化、定址方便、高效。2、程序在運行的時候,與函數庫沒有關系,移植性更強。
缺點:1、消耗資源較大,每個進程在使用靜態庫的時候,都要復制一份才可以,這也就造成了內存的消耗。2、在程序更新、部署、發布的時候,使用靜態庫相對麻煩,如果一個靜態庫更新了,那它的應用程序都需要重新編譯,再發送給用戶,有的時候可能只是一個小的改動,但對於用戶來說,會導致整個程序重新下載。
動態庫
在程序編譯時不會被連接到目標代碼中,在後期運行時才會載入,不同的應用程序如果調用相同的庫,內存中只有一份共享庫的拷貝,也就避免了空間的浪費問題。一般以.so作為文件後綴名,也分為三部分:1、前綴:lib,2、庫名稱:自定義,3、後綴:.so
動態庫優缺點
優點:1、節省內存2、部署、升級相對方便,只需要更換動態庫,再重新啟動服務即可。
缺點:1、載入速度比靜態庫慢2、移植性較差,需要把所有用到的動態庫進行移植。