導航:首頁 > 源碼編譯 > c怎麼編譯成靜態鏈接庫

c怎麼編譯成靜態鏈接庫

發布時間:2024-09-10 10:50:28

『壹』 一個關於創建C語言函數庫的問題

靜態鏈接庫(Static Libary)

用VS2008做一個靜態鏈接庫先

打開VS2008,選擇控制台應用程序,下一步裡面選擇lib

新建static_lib.h 和static_lib.cpp 兩個文件,這兩個文件的內容如下:

static_lib.h:
intadd(intx,inty);
intsubstract(intx,inty);

static_lib.cpp:
#include"static_lib.h"
intadd(intx,inty)
{
returnx+y;
}
intsubstract(intx,inty)
{
returnx-y;
}
編譯,生成解決方案,好,這樣不出意外會在debug文件夾(與staticCai並列)下生成一個工程名.lib文件,好了,這個就是我們做好的靜態鏈接庫。下面,我們看看怎麼用這個靜態鏈接庫。我們再新建一個win32控制台程序,新建main.cpp內容如下:
#include<iostream>
#include"static_lib.h"
#pragmacomment(lib,"static.lib")
usingnamespacestd;

intmain()
{
cout<<add(3,4)<<endl;
cout<<substract(5,3)<<endl;
return0;
}

並且將 工程名.lib和static_lib.h這兩個文件拷貝到與main.cpp並列的文件夾下。然後,我們編譯,鏈接,執行程序,就會出結果了

#pragma comment(lib, "static.lib")這句和我們在 項目->屬性->連接器->附加庫目錄 的效果是一樣的。至此,怎麼做靜態鏈接庫以及怎麼用靜態鏈接庫就搞定了。現在,我們把剛剛拷貝過來的.lib給刪了,我們發現,程序照樣執行,但是不能再鏈接了。所以,我們得出這樣的結論:我們再鏈接的時候需要靜態鏈接庫,一旦鏈接成功,生成了可執行文件,那麼,靜態鏈接庫就不再需要了。

『貳』 如何生成靜態庫和動態庫

靜態庫

靜態庫的後綴是.a,它的產生分兩步

Step 1.由源文件編譯生成一堆.o,每個.o里都包含這個編譯單元的符號表
Step 2.ar命令將很多.o轉換成.a,成為靜態庫
動態庫的後綴是.so,它由gcc加特定參數編譯產生。具體方法參見後文實例。123123

在 GNU/Linux 系統中靜態鏈接文件實際上就是多個 .o 文件的壓縮包。假設我們有 cool.h cool.c 和 some.c 文件,要得到靜態鏈接庫 libcool.a。首先使用如下指令得到相應的 object 文件 cool.o 和 some.o:

gcc -c cool.c
gcc -c some.c1212

用這種方法生成的 object 文件稱為 PDC 即位置相關代碼(position-dependence code)。再使用如下指令可以得到靜態鏈接文件 libcool.a:

ar -r libcool.a cool.o some.o
ranlib libcool.a1212

靜態鏈接庫 libcool.a 遵從 GNU/Linux 規定的靜態鏈接庫命名規范,必須是」libyour_library_name.a」

動態庫

在 GNU/Linux 中動態鏈接文件,必需通過鏈接器 ld 生成。假設我們有 hot.c other.c 等文件要生成動態鏈接庫 libhot.so 。首先使用如下指令得到相應的 object 文件 hot.o 和 some.o

gcc -fPIC -c hot.c
gcc -fPIC -c other.c1212

參數 -fPIC 指定生成的 object 文件為位置無關代碼(position-independence code),只有 PIC 可以被用作生成動態鏈接庫。然後使用如下指令得到動態庫:

ld -Bshared -o libhot.so hot.o other.o11

或者可以使用編譯器的ld wrapper:

gcc -shared -o libhot.so hot.o other.o11

也可以使用編譯器直接生成動態庫:

gcc -fPIC -shared -o libhot.so hot.c other.c11

這里選項 -shared 指示目標文件的類型是動態鏈接庫,動態庫的命名規范是」libyour_library_name.so」

『叄』 makefile 生成動態庫和靜態庫的區別

生成動態庫的時候要注意,編譯生成目標文件的時候加上-fPIC參數,生成位置無關的可重定位代碼,然後鏈接的時候加上-shared生成動態共享庫。比如一個hello.c,生成靜態庫:

gcc-ohello.o-chello.c
arrcslibhello.ahello.o

生成動態庫的命令:

gcc-fPIChello.o-chello.c
gcc-shared-olibhelllo.sohello.o

還有一個區別是:靜態庫參與鏈接過程,而動態庫不鏈接到可執行文件中,可執行程序在運行的時候,對應的動態庫也要載入到內存中,否則可執行程序運行不了。

更多詳細細節,可以網路搜索視頻教程:Makefile工程實踐

『肆』 GCC中靜態連接和動態連接的區別

gcc中靜態連接和動態鏈接的方法:

1:GCC的靜態連接,直接把靜態庫的名字放在gcc後面

例如:gcc-otesttest.cstaticlib.a


2:GCC的動態連接,使用-l指定庫,-L指定庫的路徑,注意動態庫名必須是lib開頭,後綴名為.so

例如:gcc-otesttest.c-lpthread-L/usr/lib/

3:靜態庫也可以採用動態庫的連接方法,如果目錄中同時存在2種庫,gcc會優先選擇動態庫。如果一條gcc鏈接指令中既要鏈接動態庫又要鏈接靜態庫,可以用-Wl,-dn和-Wl,-dy參數選項來切換。

靜態連接和動態鏈接的主要區別:

1:靜態連接的時候,靜態庫的所有執行代碼被直接編譯到目標程序中。而動態連接的時候,僅僅把動態庫的函數和變數的符號名,地址偏移量等導入到目標程序。只有在目標程序運行的時候才把動態庫的執行代碼載入到內存中。


2:動態鏈接的項目容易管理,把不同模塊封裝成不同的動態庫,如果模塊功能修改,一般只需要重新生成該動態庫,不用重新編譯其他模塊和目標程序。而靜態鏈接的程序修改任何一個地方都必須重新編譯整個程序


3:靜態鏈接生成的目標程序體積比動態鏈接的大,但是載入速度更快,發布更容易,不需要檢查發布機器上是否有該動態庫或者動態庫版本是否符合要求。


4:如果多個程序使用一個動態庫,則該庫的執行代碼只會在內存中載入一次。而靜態庫是多次載入(事實上靜態庫連接完就沒用了,等於目標程序的一部分)。


5:從調試的角度來說,靜態連接的程序調試方法和獨立程序沒有任何區別,而動態庫的調試相對要復雜一些,因為庫裡面的符號地址都是相對地址。

『伍』 如何編譯C/Fortran動態/靜態鏈接庫

首先,傳統的編譯,也就是
靜態編譯
是把
源文件
翻譯成目標文件,這個是一次性過程,也就是你所謂的靜態編譯。
後來的Java和.NET等語言,首先編譯成中間形式,然後運行過程中根據需要編譯成本地代碼(注意這個過程不是一次性的,下次運行重新編譯),這個就是JIT(即時編譯)技術,從即時編譯發展出了動態編譯技術
————————————
(傳統的)編譯完成後,像C/C++、Fortran、匯編等語言,可以把多個目標文件合並到一個
庫文件
中,這個就是靜態庫。比如常說的
庫函數
printf就是libc裡面的函數。
如果有了啟動函數(main),main裡面使用了printf,就可以通過
靜態鏈接
技術,從libc中提取出printf所在的文件加入到可執行文件中,如果printf還需要其它函數,就繼續搜索並加入列表,直到形成一個
閉包
。這個就是靜態鏈接。
可是靜態鏈接有個明顯的缺點,如果每個程序都需要printf,那麼printf這個函數的代碼就會同時存在在每個程序中,這樣也太佔地方了吧。所以發明了動態連接技術,其實有兩種形式。無論哪一種,都是首先記錄下需要調用printf這個函數以及所在的
動態庫
,等到運行的時候再載入動態庫,從動態庫中找到真正的printf去執行。
由於,
動態鏈接
技術需要一些額外的信息,傳統的靜態庫是不具備的,這些額外信息主要是重復載入和卸載時所需要的一些代碼,因此需要
動態鏈接庫

閱讀全文

與c怎麼編譯成靜態鏈接庫相關的資料

熱點內容
生存為什麼不能使用命令方塊 瀏覽:200
java與sqlserver資料庫連接 瀏覽:21
鐵路解壓視頻全過程 瀏覽:442
主備核心交換機如何連接伺服器 瀏覽:704
白金卡哪個app最靠譜 瀏覽:666
本田汽車空調壓縮機保險絲 瀏覽:155
康佳led47r5500pdf通病 瀏覽:821
cad圓相切命令 瀏覽:69
bmp文件夾打開 瀏覽:502
u盤裝系統文件下載到哪個文件夾 瀏覽:21
es系統封裝教程程序員大本營 瀏覽:523
程序員聚餐喝什麼酒好 瀏覽:608
編譯程序生成安裝文件 瀏覽:955
linux查看usb設備 瀏覽:284
安卓怎麼禁止app充值 瀏覽:559
動盪對加密貨幣的影響 瀏覽:358
國家反詐app哪裡看注冊時間 瀏覽:563
打孔式文件夾怎麼裝視頻 瀏覽:29
php怎麼學比較好 瀏覽:381
python中關於函數調用 瀏覽:362