linux下.a/.so/.la目標庫區別 - 天緣部落格
linux下.a/.so/.la目標庫區別
在linux平台上編譯時,常會遇到目標庫的疑問,有靜態庫也有動態庫,單個理解都不太難,但是對複雜的工程而言,一旦混合到一起去,對整個工程的理解和呼叫,將會造成很大困擾,本文就彙總這幾種常見編譯結果檔案的區別。
一、格式說明
linux下編譯,常會遇到字尾為:.o .so .a .la .ko等格式檔案,儘管linux並不以副檔名作為識別檔案格式的唯一依據,但規範約定還是有的,如下:
.o 是目標物件檔案,相當於windows中的.obj檔案
.a 為靜態庫,可以是乙個或多個.o合在一起,用於靜態連線
.la 為libtool生成的共享庫,其實是個配置文件。可以用$file *.la檢視*.la檔案,或用vi來檢視。
.so 為共享庫,類似windows平台的dll檔案
二、建立例項
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庫
$libtool --mode=link gcc -o libmylib.la -rpath /usr/lib –l/usr/lib –la
01 tst@tst-pc /cygdrive/d/
02 $ libtool --help
03 usage: libtool [option]... [mode-arg]...
04
05 provide generalized library-building support services.
06
07 --config show all configuration variables
08 --debug enable verbose shell tracing
09 -n, --dry-run display commands without modifying any files
10 --features display basic configuration information and exit
11 --mode=mode use operation mode mode
12 --preserve-dup-deps don't remove duplicate dependency libraries
13 --quiet, --silent don't print informational messages
14 --no-quiet, --no-silent
15 print informational messages (default)
16 --tag=tag use configuration variables from tag tag
17 -v, --verbose print more informational messages than default
18 --no-verbose don't print the extra informational messages
19 --version print version information
20 -h, --help, --help-all print short, long, or detailed help message
21
22 mode must be one of the following:
23
24 clean remove files from the build directory
25 compile compile a source file into a libtool object
26 execute automatically set library path, then run a program
27 finish complete the installation of libtool libraries
28 install install libraries or executables
29 link create a library or an executable
30 uninstall remove libraries from an installed directory
31
32 mode-args vary depending on the mode. when passed as first option,
33 `--mode=mode' may be abbreviated as `mode' or a unique abbreviation of that.
34 try `libtool --help --mode=mode' for a more detailed description of mode.
35
36 when reporting a bug, please describe a test case to reproduce it and
37 include the following information:
38
39 host-triplet: i686-pc-cygwin
40 shell: /bin/sh
41 compiler: gcc
42 compiler flags: -g -o2 -pipe
43 linker: /usr/i686-pc-cygwin/bin/ld.exe (gnu? yes)
44 libtool: (gnu libtool) 2.4
45 automake: automake (gnu automake) 1.11.1
46 autoconf: autoconf (gnu autoconf) 2.68
47
48 report bugs to .
49 gnu libtool home page: .
50 general help using gnu software: .
linux下 a so la目標庫區別
在linux平台上編譯時,常會遇到目標庫的疑問,有靜態庫也有動態庫,單個理解都不太難,但是對複雜的工程而言,一旦混合到一起去,對整個工程的理解和呼叫,將會造成很大困擾,本文就彙總這幾種常見編譯結果檔案的區別。linux下編譯,常會遇到字尾為 o so a la ko等格式檔案,儘管linux並不以副...
Linux靜態庫和動態庫區別
我們通常把一些公用函式製作成函式庫,供其它程式使用。函式庫分為靜態庫和動態庫兩種。靜態庫在程式編譯時會被連線到目標 中,程式執行時將不再需要該靜態庫。動態庫在程式編譯時並不會被連線到目標 中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。本文主要通過舉例來說明在linux中如何建立靜態...
在Linux環境下檢視目標檔案生成過程
include int main 開啟終端,輸入指令 ls。顯示當前資料夾內的所有檔案,然後進入其中的workspace資料夾。如圖 然後在輸入指令 vim hello.c。在spacework裡建立hello.c檔案。之後就會進入編輯器,在編輯器裡可以輸入相應的源 輸入完成後按 esc 鍵,之後再...