動態庫的編譯執行

2022-03-16 22:59:24 字數 2346 閱讀 4337

在windows下動態鏈結庫是以.dll字尾的檔案,二在linux中,是以.so作字尾的檔案。

動態鏈結庫的好處就是節省記憶體空間。

1、linux下建立動態鏈結庫

在使用gcc編譯程式時,只需加上-shared選項即可,這樣生成的執行程式即為動態鏈結庫。

例如有檔案:hello.c x.h main.c

[plain]view plain

copy

編譯:gcc hello.c -fpic -o libhello.so  

其中-fpic選項的作用是:表示編譯為位置獨立的**,不用此選項的話編譯後的**是位置相關的,

所以動態載入時是通過**拷貝的方式來滿足不同的呼叫,而不能達到真正的**段共享的目的.

將main.c與hello.so動態庫

[plain]view plain

copy

gcc main.c -l. -lhello -o main  

一、動態鏈結庫

1.建立hello.so動態庫

[cpp]view plain

copy

#include 

void hello()  

編譯:gcc -fpic -shared hello.c -o libhello.so  

2.hello.h標頭檔案

[cpp]view plain

copy

void hello();  

3.鏈結動態庫

[cpp]view plain

copy

#include 

#include "hello.h"  

int main()  

編譯:gcc main.c -l. -lhello -o main  

這裡-l的選項是指定編譯器在搜尋動態庫時搜尋的路徑,告訴編譯器hello庫的位置。"."意思是當前路徑.

[plain]view plain

copy

in function `main':  

main.c:(.text+0x1d): undefined reference to `hello'  

collect2: ld returned 1 exit status  

[plain]view plain

copy

sudo cp libhello.so /usr/lib/  

這樣,再次執行就成功輸入:

call hello()

二、靜態庫

檔案有:main.c、hello.c、hello.h

1.編譯靜態庫hello.o: 

[plain]view plain

copy

gcc hello.c -o hello.o  #這裡沒有使用-shared  

2.把目標文件歸檔

[plain]view plain

copy

ar -r libhello.a hello.o  #這裡的ar相當於tar的作用,將多個目標打包。  

程式ar配合引數-r建立乙個新庫libhello.a,並將命令列中列出的檔案打包入其中。這種方法,如果libhello.a已經存在,將會覆蓋現在檔案,否則將新建立。

3.鏈結靜態庫

[plain]view plain

copy

gcc main.c -lhello -l. -static -o main  

這裡的-static選項是告訴編譯器,hello是靜態庫。

或者:[plain]view plain

copy

gcc main.c libhello.a -l. -o main  

這樣就可以不用加-static

4.執行./main

輸出:call hello()

三、借助自帶的ldd實現程式來分析動態庫搜尋情況

ldd main

結果:linux-gate.so.1 =>  (0x00efd000)

libhello.so => /usr/lib/libhello.so (0x00f6b000)

libc.so.6 => /lib/libc.so.6 (0x001a5000)

/lib/ld-linux.so.2 (0x00eb8000)

如果目標程式沒有鏈結動態庫,則列印「not a dynamic executable」 

Linux如何查詢動態庫 編譯 執行

1 gcc編譯 鏈結命令中的 l選項 2 gcc的環境變數的library path 多個路徑用冒號分割 3 gcc預設動態庫目錄 lib usr lib usr lib64 usr local lib。1 編譯目標 時指定的動態庫搜尋路徑 用選項 wl,rpath和include指定的動態庫的搜尋...

編譯後執行沒有動態庫問題

使用交叉編譯工具鏈的c 工具編譯成的elf檔案在海思開發板執行報如下錯誤 debug can t load library libgcc s.so.1 解決辦法 將海思提供的交叉編譯工具鏈中的對應庫拷貝至開發板上即可。1 進入到安裝交叉編譯器的目錄下,cd opt hisi linux x86 ar...

編譯靜態庫編譯動態庫

編譯靜態庫 cr標誌告訴ar將object檔案封裝 archive 我們可以使用nm s 命令來檢視.a檔案的內容 ar cr libmyhello.a hello.o 或 cvr 編譯動態庫 gcc c fpic test1.c gcc c fpic test2.c fpic告訴gcc將源 編譯成...