一般是建立共享庫的命令如下
這樣生成的共享庫還差點意思,完整格式應該同時設定共享庫的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]
字段。
不使用 -wl,-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
[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
是否需要 -fpic 選項?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
為了方便除錯,又不想更改環境變數,可以把動態庫所在目錄的絕對路徑(或相對路徑)寫死在可執行檔案中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...