gcc動態庫與動態庫生成和鏈結

2021-09-29 10:35:47 字數 2306 閱讀 6914

一般是建立共享庫的命令如下

gcc -fpic -c foo.c -o foo.o

gcc -fpic -c bar.c -o bar.o

gcc -shared foo.o bar.o -o libz.so

gcc main.c -lz -l.

-o main

這樣生成的共享庫還差點意思,完整格式應該同時設定共享庫的soname

gcc -shared -wl,

-soname,libname.so.x lib foo.o bar.o -o libz.so.x.y.z

soname的作用

linux下通過共享庫實現多程式共享**;共享庫的存放路徑以及共享庫的版本管理由ldconfig命令及相關例程負責,其中soname是實現版本管控的一環。

設定了soname,在生成的so檔案裡有[soname]字段。

$ gcc -shared -wl,

-soname,libz2.so.

1-o libz2.so.

1.2.0

$ readelf -a libz2.so.

1.2.0

| grep -i so

l (large)

, p (processor specific)

0x0000000000000001

(needed) shared library:

[libc.so.6]

0x000000000000000e

(soname) library soname:

[libz2.so.1]

36:0000000000200e00

0 object local default 17 __dso_handle

000000

: version:

1 file: libc.so.

6 cnt:

1

不使用 -wl,-soname,生成的共享庫裡面沒有[soname]字段。

$ gcc bar.o -shared -o libz.so.1.2.0

$ readelf -a libz.so.1.2.0 |

grep -i so

l (large), p (processor specific)

0x0000000000000001 (needed) shared library: [libc.so.6]

39: 0000000000200e10 0 object local default 19 __dso_handle

000000: version: 1 file: libc.so.6 cnt: 1

gcc -c foo.c -o foo.o

gcc -c bar.c -o bar.o

ar rcs libz.a file1.o file2.o

gcc main.c -lz -l.

-o main

是否需要 -fpic 選項?

gcc -fpic -g -c -wall a.c

gcc -fpic -g -c -wall b.c

gcc -shared -wl,

-soname,libz.so.

1 \ -o libz.so.

1.0.1 a.o b.o -lc

為了方便除錯,又不想更改環境變數,可以把動態庫所在目錄的絕對路徑(或相對路徑)寫死在可執行檔案中-wl,-rpath,gcc -wl,rpath,. main.c -lz -l. -o main。這樣生成的可執行程式,當其執行時,會直接從編譯時設定的default_lib_install_path路徑下搜尋共享庫。

生成最終可執行檔案時,對於靜態庫,需要指定庫的名字和庫的搜尋路徑。

對於動態庫,編譯時指定動態庫和庫所在的路徑;執行時也需要動態庫路徑,指定方式有

使用一般方法,ld.so

在連線時,

program library howto

鳥哥的linux私房菜 第二十一章、軟體安裝:原始碼與 tarball

linux下動態庫及版本號控制

GCC 生成動態鏈結庫

linux 下動態鏈結庫 shared object file,共享物件檔案 的檔案字尾為.so,它是一種特殊的目標檔案 object file 可以在程式執行時被載入 鏈結 進來。使用動態鏈結庫的優點是 程式的可執行檔案更小,便於程式的模組化以及更新,同時,有效記憶體的使用效率更高。如果想建立乙個...

gcc生成靜態庫和動態庫

假設當前目錄下有這些原始檔 main.c func.c func.h 其中main.c要呼叫func.c中的函式。生成靜態庫 gcc c func.c o func.o ar rcs libfunc.a func.o gcc main.c o main static l.lfunc main 生成動...

gcc使用 動態庫鏈結靜態庫

最近自己的專案中遇到乙個問題 編譯乙個動態庫,動態庫中使用了靜態庫的函式如下圖所述 問題來了怎麼編譯最終得到乙個帶有靜態鏈結的動態庫lib so?生成靜態庫lib 1 gcc o 1.o c 1.c ar r 1.o lib 1.a 生成靜態庫lib 2 gcc o 2.o c 2.c ar r 2...