1. 程式人生 > >Linux .a與.so的區別

Linux .a與.so的區別

在linux平臺上編譯時,常會遇到目標庫的疑問,有靜態庫也有動態庫,單個理解都不太難,但是對複雜的工程而言,一旦混合到一起去,對整個工程的理解和呼叫,將會造成很大困擾,本文就彙總這幾種常見編譯結果檔案的區別。

一、格式說明

linux下編譯,常會遇到字尾為:.o .so .a .la .ko等格式檔案,儘管linux並不以副檔名作為識別檔案格式的唯一依據,但規範約定還是有的,如下:

  • .o 是目標物件檔案,相當於windows中的.obj檔案
  • .a 為靜態庫,可以是一個或多個.o合在一起,用於靜態連線
  • .la 為libtool生成的共享庫,其實是個配置文件。可以用$file *.la檢視*.la檔案,或用vi來檢視。
  • .so 為共享庫,類似windows平臺的dll檔案

補充: 還有一種副檔名為.ko 檔案,不過它是Linux核心使用的動態連結檔案字尾,屬於模組檔案,用來在Linux系統啟動時載入核心模組。

二、建立例項

1、建立.o物件檔案

$ gcc -c test.c

生成test.o,跳過連結物件,所以不是可執行檔案。

2、建立.a靜態庫檔案

$ ar -r libtest.a test1.o test2.o

3、建立動態庫.so

$ gcc -Wall -fpic -shared test1.c test2.c -o libtest.so

上一句執行,將test1.c和test2.c編譯生成動態庫檔案libtest.so

4、連結庫檔案

$ gcc -Wall -fpic -shared -Ltest test3.c -o libtest.so

編譯test3.c後並與靜態libtest.a連結(預設會到/usr/lib下找該檔案)生成libtest.so動態庫。

5、生成.la庫

.la庫一般通過makefile進行,當然也可以通過命令列進行,參考命令:

$libtool --mode=link gcc -o libmylib.la -rpath /usr/lib –L/usr/lib –la

libtool將會搜尋libmylib.a檔案,並傳家libmylib.la。更多libtool幫助如下:

[email protected]
/cygdrive/d/ $ libtool --help Usage: libtool [OPTION]... [MODE-ARG]... Provide generalized library-building support services. --config show all configuration variables --debug enable verbose shell tracing -n, --dry-run display commands without modifying any files --features display basic configuration information and exit --mode=MODE use operation mode MODE --preserve-dup-deps don't remove duplicate dependency libraries --quiet, --silent don't print informational messages --no-quiet, --no-silent print informational messages (default) --tag=TAG use configuration variables from tag TAG -v, --verbose print more informational messages than default --no-verbose don't print the extra informational messages --version print version information -h, --help, --help-all print short, long, or detailed help message MODE must be one of the following: clean remove files from the build directory compile compile a source file into a libtool object execute automatically set library path, then run a program finish complete the installation of libtool libraries install install libraries or executables link create a library or an executable uninstall remove libraries from an installed directory MODE-ARGS vary depending on the MODE. When passed as first option, `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. Try `libtool --help --mode=MODE' for a more detailed description of MODE. When reporting a bug, please describe a test case to reproduce it and include the following information: host-triplet: i686-pc-cygwin shell: /bin/sh compiler: gcc compiler flags: -g -O2 -pipe linker: /usr/i686-pc-cygwin/bin/ld.exe (gnu? yes) libtool: (GNU libtool) 2.4 automake: automake (GNU automake) 1.11.1 autoconf: autoconf (GNU Autoconf) 2.68 Report bugs to <[email protected]>. GNU libtool home page: <http://www.gnu.org/software/libtool/>. General help using GNU software: <http://www.gnu.org/gethelp/>.