當前位置:首頁 » 編程軟體 » 編譯動態庫

編譯動態庫

發布時間: 2022-01-10 18:01:30

php動態庫怎麼編譯

# 聲稱動代連接庫,假設名稱為libtest.so
gcc x.c y.c z.c -fPIC -shared -o libtest.so

# 將main.c和動態連接庫進行連接生成可執行文件
gcc main.c -L. -ltest -o main

# 輸出LD_LIBRARY_PATH環境變數,一邊動態庫裝載器能夠找到需要的動態庫
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

# 測試是否動態連接,如果列出libtest.so,那麼應該是連接正常了
ldd main

# 執行就不用說了吧

--------------------------------------------------
建議創建一個Makefile來作這些事情。

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下,有幾個.so。如何將這幾個動態庫編譯成一個動態庫

g++ -l*** -l*** -L 庫目錄. 一次g++ 是可以同時連接多個動態庫的.不用把多個動態庫編成一個.

⑷ linux 編譯怎麼連接動態庫

Linux的動態庫文件是以lib字樣開頭的.so文件,編譯鏈接動態庫有兩個要點:一個是需要用-L選項指定動態庫的搜索路徑,這個搜索路徑是需要連接的so文件的大致路徑,比如/usr/openssl/lib;另外還需要用-l(這個是小寫的L)選項指定動態庫的名字,比如下面這條編譯命令:
gcc -o hello hello.c -L/usr/openssl/lib -lcrypto

⑸ openssl怎麼編譯成動態庫

1、靜態編譯
./Configure linux-elf-arm -DB_ENDIAN linux:'armeb-linux-gcc -mbig-endian' --prefix=$(pwd)/OpenSSL
a、 將openssl-0.9.8d/crypto/bio/bss_file.c中以下代碼注釋掉
//#ifndef _FILE_OFFSET_BITS
//#define _FILE_OFFSET_BITS 64
//#endif
#endif
b、 報錯沒有timeb.h時,在報錯的.c文件中#undef TIMEB
c、 去掉openssl頂層Makefile中「build_all:」後面的 build_app build_test (我們要的只是兩個靜態庫libcrypto.a和libssl.a),並去掉」DIRS=」後面的app和tests。
make && make install

2、動態庫
1.config:
#config no-asm --prefix=../OpenSSL
2.改Makefile
1) CC= gcc 改成 CC = armeb-linux-gcc;
2) 刪除 CFLAG= 中的 「-march=pentium」;
3) AR=ar $(ARFLAGS) r 改為 AR=armeb-linux-ar $(ARFLAGS) r;
4) ARD=ar $(ARFLAGS) d 改為 ARD=armeb-linux-ar $(ARFLAGS) d;
5)RANLIB= /usr/bin/ranlib 改為 RANLIB= armeb-linux-ranlib;
3.編譯
#make
#make install

⑹ 缺少動態庫的情況下,能通過編譯嗎

>> 如果你是鏈接動態庫,在GCC後跟了一個-l參數,其後就是你所需庫的名稱,
>> 那麼你不僅需要那個你所需的庫文件,還需要你所需庫的頭文件才行,編譯時需要頭文件支持,
>> 鏈接時需要庫文件,不管你是動態還是靜態編譯都是如此!!!!
頭文件不是必須的。只要沒有出現未聲明的函數/變數的調用就可以。

>> 還需說明的一點是:只有用參數-o時才會有那個-satic的選項,
>> 也就是說只有在鏈接程序時才會有動態鏈接和靜態鏈接之分!!!!!!
沒有 -o 也可以 -static。-o 不代表鏈接

>> 動態鏈接庫是為了減少可執行文件的大小,就是在一個系統中只提供一個庫,
>> 可供多個動態鏈接的程序共同使用
同時也避免庫代碼被重復載入進入內存,減少系統內存佔用

⑺ acc和gcc編譯動態庫的區別

編譯動態庫時,acc使用-b開關,gcc使用-share開關,acc使用-AA開關編譯標准c++代碼,-mt加入多線程鏈接,gcc使用-pthread開關,acc使用+Markered開關編譯出cpp文件所需的頭文件,並以xxx.d文件形式存放,acc和gcc的共同的開關有-I加入頭文件目錄,-l開關加入依賴的動態庫鏈接,-L開關加入動態庫搜尋的路徑,-o開關輸出目標文件,-g開關加入調試信息,-w開關加入警告級別。在64位的機器上,acc使用+DD32開關編譯32位程序,gcc使用-milp32編譯32位程序,此外,在64位機器上,默認是編譯32位的程序。

⑻ 動態庫的編譯


生成動態連接庫,假設名稱為libtest.so
gcc x.cy.cz.c-fPIC-shared-olibtest.so
將main.c和動態連接庫進行連接生成可執行文件
gcc main.c-L.-ltest-omain
輸出LD_LIBRARY_PATH環境變數,以便動態庫裝載器能夠找到需要的動態庫
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
測試是否動態連接,如果列出libtest.so,那麼應該是連接正常了
ldd main

⑼ 如何編譯動態庫,該動態庫需要鏈接另外一個動態庫

看你的makefile, 猜測是沒有指定動態庫頭文件的路徑. -I編譯參數來指定

⑽ 如何用gcc編譯動態庫

今天要用到靜態庫和動態庫,於是寫了幾個例子來鞏固一下基礎。
hello1.c ————————————————————
#include <stdio.h>
void print1(int i) { int j; for(j=0;j<i;j++) { printf("%d * %d = %d\n",j,j,j*j); } }
hello2.c _________________________________________________
#include <stdio.h>
void print2(char *arr) { char c; int i=0; while((c=arr[i++])!='\0') { printf("%d****%c\n",i,c); } }
hello.c ____________________________________________________
void print1(int); void print2(char *);
int main(int argc,char **argv) { int i=100; char *arr="THIS IS LAYMU'S HOME!"; print1(i); print2(arr);
return 0; }

可以看到hello.c要用到hello1.c中的print1函數和hello2.c中的print2函數。所以可以把這兩個函數組合為庫,以供更多的程序作為組件來調用。

方法一:將hello1.c和hello2.c編譯成靜態鏈接庫.a
[root@localhost main5]#gcc -c hello1.c hello2.c
//將hello1.c和hello2.c分別編譯為hello1.o和hello2.o,其中-c選項意為只編譯不鏈接。
[root@localhost main5]#ar -r libhello.a hello1.o hello2.o
//將hello1.o和hello2.o組合為libhello.a這個靜態鏈接庫
[root@localhost main5]#cp libhello.a /usr/lib
//將libhello.a拷貝到/usr/lib目錄下,作為一個系統共享的靜態鏈接庫
[root@localhost main5]#gcc -o hello hello.c -lhello
//將hello.c編譯為可執行程序hello,這個過程用到了-lhello選項,這個選項告訴gcc編譯器到/usr/lib目錄下去找libhello.a的靜態鏈接庫
以上的過程類似於windows下的lib靜態鏈接庫的編譯及調用過程。
方法二:將hello1.o和hello2.o組合成動態鏈接庫.so
[root@localhost main5]#gcc -c -fpic hello1.c hello2.c
//將hello1.c和hello2.c編譯成hello1.o和hello2.o,-c意為只編譯不鏈接,-fpic意為位置獨立代碼,指示編譯程序生成的代碼要適合共享庫的內容這樣的代碼能夠根據載入內存的位置計算內部地址。
[root@localhost main5]#gcc -shared hello1.o hello2.o -o hello.so
//將hello1.o和hello2.o組合為shared object,即動態鏈接庫
[root@localhost main5]#cp hello.so /usr/lib
//將hello.so拷貝到/usr/lib目錄下
[root@localhost main5]#gcc -o hello hello.c hello.so
//將hello.c編譯鏈接為hello的可執行程序,這個過程用到了動態鏈接庫hello.so

在這里要廢話幾句,其實一切的二進制信息都有其運作的機制,只要弄清楚了它的機制,並能夠實現之,則任何此時此刻無法想像之事都將成為現實。當然,這兩者之間的巨大鴻溝需要頂級的設計思想和頂級的代碼來跨越。

熱點內容
為什麼安卓充電線充不上電了 發布:2024-12-23 13:06:14 瀏覽:223
配置管理由什麼組成 發布:2024-12-23 12:57:47 瀏覽:560
運動版雅閣有哪些配置 發布:2024-12-23 12:57:45 瀏覽:277
ofp腳本 發布:2024-12-23 12:57:35 瀏覽:49
伺服器地址怎麼設置成域名 發布:2024-12-23 12:51:22 瀏覽:217
理財金額怎麼配置 發布:2024-12-23 12:44:18 瀏覽:69
aspnet文件訪問 發布:2024-12-23 12:39:02 瀏覽:154
搭建郵件伺服器的方法 發布:2024-12-23 12:27:27 瀏覽:430
資料庫說明文檔 發布:2024-12-23 12:22:12 瀏覽:620
安卓手機玩mc卡怎麼辦 發布:2024-12-23 12:15:46 瀏覽:5