導航:首頁 > 源碼編譯 > linux編譯靜態庫

linux編譯靜態庫

發布時間:2022-02-16 04:35:21

linux靜態庫怎麼編譯

linux庫有動態與靜態兩種,動態通常用.so為後綴,靜態用.a為後綴。例如:libhello.so
libhello.a
為了在同一系統中使用不同版本的庫,可以在庫文件名後加上版本號為後綴,例如:
libhello.so.1.0,由於程序連接默認以.so為文件後綴名。所以為了使用這些庫,通常使用建立符號連接的方式。
ln
-s
libhello.so.1.0
libhello.so.1
ln
-s
libhello.so.1
libhello.so
動態庫和靜態庫的區別:
當要使用靜態的程序庫時,連接器會找出程序所需的函數,然後將它們拷貝到執行文件,由於這種拷貝是完整的,所以一旦連接成功,靜態程序庫也就不再需要了。然而,對動態庫而言,就不是這樣。動態庫會在執行程序內留下一個標記『指明當程序執行時,首先必須載入這個庫。由於動態庫節省空間,linux下進行連接的預設操作是首先連接動態庫,也就是說,如果同時存在靜態和動態庫,不特別指定的話,將與動態庫相連接。
兩種庫的編譯產生方法:
第一步要把源代碼編繹成目標代碼。以下面的代碼hello.c為例,生成hello庫:
/*
hello.c
*/
#include
void
sayhello()
{
printf("hello,world\n");
}
用gcc編繹該文件,在編繹時可以使用任何全法的編繹參數,例如-g加入調試代碼等:
gcc
-c
hello.c
-o
hello.o
1.連接成靜態庫
連接成靜態庫使用ar命令,其實ar是archive的意思
$ar
cqs
libhello.a
hello.o
2.連接成動態庫
生成動態庫用gcc來完成,由於可能存在多個版本,因此通常指定版本號:
$gcc
-shared
-wl,-soname,libhello.so.1
-o
libhello.so.1.0
hello.o
另外再建立兩個符號連接:
$ln
-s
libhello.so.1.0
libhello.so.1
$ln
-s
libhello.so.1
libhello.so
這樣一個libhello的動態連接庫就生成了。最重要的是傳gcc
-shared
參數使其生成是動態庫而不是普通執行程序。
-wl
表示後面的參數也就是-soname,libhello.so.1直接傳給連接器ld進行處理。實際上,每一個庫都有一個soname,當連接器發現它正在查找的程序庫中有這樣一個名稱,連接器便會將soname嵌入連結中的二進制文件內,而不是它正在運行的實際文件名,在程序執行期間,程序會查找擁有
soname名字的文件,%b

㈡ LInux 如何使用GCC編譯器將一個文件夾下的100個.o文件打包成一個靜態庫文件(.a)

你已經用gcc編譯出目標文件了,用ar工具打包成.a文件就行了啊,示例:


如上圖,假設我有test1.c,test2.c兩個源文件,先使用gcc -c *.c將源文件編譯成目標文件,可以看到,生成了test1.o,test2.o兩個目標文件,然後,使用ar命令:ar crv libtest.a *.o將該目錄下的所有目標文件打包生成了libtest.a文件。這樣,你在編譯的時候就可以直接使用這個靜態庫了。

㈢ linux a 靜態庫 怎麼設置

Linux的靜態庫文件並不需要設置啊,編譯鏈接.a靜態庫文件時只需要加上.a文件的完整路徑就可以了,比如:
gcc
-o
hello
hello.c
/usr/lib/libm.a
只有編譯鏈接動態庫才需要用-L選項來設置動態庫的搜索路徑,比如這個命令:
gcc
-o
hello
hello.c
-L/usr/openssl/lib
-lcrypto

㈣ Linux2.6 如何編寫Makefile,使驅動程序能夠編譯鏈接靜態庫

就我的感覺,靜態庫是編譯好的.o文件,你只要將靜態庫(mylib.a)放置於 /lib 以及/usr/lib 文件夾下,然後在gcc編譯器的變數中 加上 -lmylib,就可以了。

㈤ linux 動態庫轉為靜態庫

libc 和 lib-linux 這兩個最基本的庫都沒有,請問其他電腦上跑的是linux嗎?沒有這兩個庫,沒有一個程序可以運行。

另外,不可能把已有的動態庫「直接」轉換成靜態庫,你只能從源碼編譯出靜態庫。

㈥ 如何編譯生成和調用靜態庫

如何編譯動態庫
gcc test1.c test2.c -shared -fPIC -o libtest.so
使用動態庫
gcc main.c -L. -ltest -o a.out
(
-L : 表示需要庫的路徑
-l:表示需要庫的名稱,如libtest.so,名稱則為test
)
(ps:執行a.out時有可能提示找不到libtest.so文件,這時需要把庫文件放入到/lib等目錄下,或者添加環境變數LD_LIBRARY_PATH,包含有庫文件的路徑即可)

如何編譯靜態庫
gcc -c test1.c test2.c
ar -r libtest.a test1.o test2.o
使用靜態庫
gcc main.c -static -L. -ltest -o a.out

-static:可強制編譯時使用靜態庫,如果不使用這個參數,而靜態庫與動態庫同名的話,會優先使用動態庫

㈦ linux下編譯怎麼鏈接靜態庫

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

㈧ linux下編譯的靜態庫可不可以在unix下用

你已經用gcc編譯出目標文件了,用ar工具打包成.a文件就行了啊,示例: 如上圖,假設我有test1.c,test2.c兩個源文件,先使用gcc -c *.c將源文件編譯成目標文件,可以看到,生成了test1.o,test2.o兩個目標文件,然後,使用ar命令:ar crv libtest.

閱讀全文

與linux編譯靜態庫相關的資料

熱點內容
微贊微擎源碼最新版 瀏覽:849
有什麼下載軟體的app推薦 瀏覽:102
雲浮數據加密有哪些 瀏覽:163
工地招聘會都有什麼app 瀏覽:476
電信運營商的伺服器叫什麼 瀏覽:370
安卓騰訊收藏文件夾 瀏覽:921
讀取文件的行數python 瀏覽:751
非所稱加密方法的優點是 瀏覽:355
文件夾一般被什麼佔用 瀏覽:73
他們的命令英語 瀏覽:811
文件夾如何打開默認最大化 瀏覽:313
怎麼測試阿里雲伺服器網路 瀏覽:927
自己的點腦的伺服器地址 瀏覽:605
大二學演算法還有 瀏覽:231
linux解壓命令war 瀏覽:718
mov壓縮mac 瀏覽:239
怎麼做點歌伺服器 瀏覽:501
java混淆編譯 瀏覽:380
李剛瘋狂java講義 瀏覽:687
易語言記錄鍵盤的命令 瀏覽:787