導航:首頁 > 源碼編譯 > 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怎麼編譯成靜態鏈接庫相關的資料

熱點內容
網頁無法打開pdf 瀏覽:555
linux命令scp 瀏覽:519
怎樣把圖片轉為pdf格式 瀏覽:115
linux變數類型 瀏覽:840
linux中網卡配置 瀏覽:704
appstore裡面的軟體怎麼設定年齡 瀏覽:290
jpg在線轉換pdf格式 瀏覽:600
java泛型詳解 瀏覽:616
pdf介質框 瀏覽:210
蘋果手機怎麼用藍牙傳app軟體到安卓 瀏覽:435
東方財富app怎麼找場內基金 瀏覽:276
粉筆app怎麼修改身份 瀏覽:529
價值投資選股公式源碼 瀏覽:681
u盤文件夾變成了白色隱藏無法使用 瀏覽:876
python如何爬取火車票 瀏覽:977
生命哲學pdf 瀏覽:61
socket程序源碼 瀏覽:156
修改文件夾用戶和用戶組 瀏覽:595
女生隱私軟體不加密不要錢 瀏覽:560
壓縮式霧化泵和霧化器一樣嗎 瀏覽:675