linux下 a so la目標庫區別

2021-09-06 08:04:30 字數 3483 閱讀 7277

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 鍵,之後再...