日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

转载:使用 GNU Libtool 创建库

發布時間:2024/1/17 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转载:使用 GNU Libtool 创建库 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自:http://www.ibm.com/developerworks/cn/aix/library/1007_wuxh_libtool/

介紹

在不同的系統中建立動態鏈接庫的方法有很大的差別,這主要是因為每個系統對動態鏈接庫的看法和實現并不相同,以及編譯器對動態鏈接庫支持的選項也不太一樣。對于開發人員,如果嘗試將使用動態庫的軟件在這些系統之間移植,需要參考枯澀難懂的系統手冊,以及修改相應的 Makefile,這一工作是乏味的,并且具有一定的難度。

使用 GNU Libtool 可以容易的在不同的系統中建立動態鏈接庫。它通過一個稱為 Libtool 庫的抽象,隱藏了不同系統之間的差異,給開發人員提供了一致的的接口。對于大部分情況,開發人員甚至不用去查看相應的系統手冊,只需要掌握 GNU Libtool 的用法就可以了。并且,使用 Libtool 的 Makefile 也只需要編寫一次就可以在多個系統上使用。

Libtool 庫可以是一個靜態鏈接庫,可以是一個動態鏈接庫,也可以同時包含兩者。在這篇文檔中,我們圍繞 Libtool 庫的建立和使用,只是在適當的說明 Libtool 庫和系統動態或者靜態鏈接庫之間的映射關系。

Libtool 是一個工具

雖然 Libtool 隱藏了在不同平臺創建鏈接庫的復雜性,但其最終還是需要底層系統對鏈接庫的支持,它不能超越系統的限制,例如,Libtool 并不能在不支持動態鏈接庫的系統中創建出動態鏈接庫。

回頁首

Libtool 基本用法

這一節以實例來說明如何使用 Libtool 從源代碼創建最終鏈接庫以及執行程序的完整步驟,這是軟件開發過程中經常使用的內容,包括 :

  • 創建 Libtool 對象文件 ;
  • 創建 Libtool 庫;
  • 安裝 Libtool 庫 ;
  • 使用 Libtool 庫 ;
  • 卸載 Libtool 庫 ;

首先需要準備一個源文件 compress.c,代碼如下:


清單 1: compress.c
#include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <limits.h> #include <assert.h> #include <zlib.h> /* 一個簡單的文件壓縮函數 */ int compress_file (const char *filename) { int src_fd, dest_fd; struct stat sb; Bytef *src, *dest; uLong dest_len; char dest_file[PATH_MAX]; src_fd = open (filename, O_RDONLY); assert (dest_fd != -1); assert (fstat (src_fd, &sb) != -1); src = mmap (NULL, sb.st_size, PROT_READ, MAP_PRIVATE, src_fd, 0); assert (src != MAP_FAILED); dest_len = compressBound (sb.st_size); dest = malloc (dest_len); assert (dest); assert (compress (dest, &dest_len, src, sb.st_size) == Z_OK); munmap (src, sb.st_size); close (src_fd); snprintf (dest_file, sizeof (dest_file), "%s.z", filename); dest_fd = creat (dest_file, S_IRUSR | S_IWUSR); assert (dest_fd != -1); write (dest_fd, dest, dest_len); close (dest_fd); free (dest); return 0; }

這個文件實現了一個函數?compress_file(),它接收一個文件名作為參數,然后對文件進行壓縮,生成一個?.z結尾的壓縮文件。在這個文件中使用了?compress()函數,這個函數是有由 libz 提供的。

從源文件建立 Libtool 庫需要經過兩個步驟,先建立 Libtool 對象文件,再建立 Libtool 庫。

建立 Libtool 對象文件

如果使用傳統的方式,建立對象文件通常使用下面的命令 :

$ gcc -c compress.c

使用 Libtool 則使用下面的命令 :

$ libtool --mode=compile gcc -c foo.c

可以看到,使用 Libtool 只需要將“傳統”的命令 (gcc -c foo.c) 作為參數傳遞給 Libtool 即可。

在上面的命令中,libtool 使用?compile模式 (--mode=compile 選項 ),這是建立對象文件的模式,Libtool 還有其它的模式,后面將介紹。

上面的命令輸出如下 :

mkdir .libs gcc -c compress.c -fPIC -DPIC -o .libs/compress.o gcc -c compress.c -o compress.o >/dev/null 2>&1

它建立了兩個文件,一個是 .libs/compress.o,在建立這個文件時,Libtool 自動插入了 -fPIC和 -DPIC選項,告訴編譯器生成位置獨立的代碼,之后將用這個文件來建立動態鏈接庫。生成第二個文件?compress.o沒有添加額外的選項,它準備用來建立靜態鏈接庫。

除了上面的兩個文件之外,Libtool 還建立了一個文件?compress.lo,這個文件就是 Libtool 對象文件,實際上也就是一個文本文件,里面記錄了建立動態鏈接庫和靜態鏈接庫分別所需要的真實文件名稱,后面 Libtool 將使用這個文件而不是直接的使用 .libs/compress.o 和 compress.o。

建立 Libtool 庫

用下面的命令建立 Libtool 庫 :

$ libtool --mode=link gcc -o libcompress.la compress.lo -rpath /tmp -lz

注意這里使用 compress.lo 作為輸入文件,并且告訴 Libtool 生成的目標文件為?libcompress.la,.la 是 Libtool 的庫文件后綴。

-rpath選項告訴 Libtool 這個庫將被安裝到什么地方,如果省略了 -rpath選項,那么不會生成動態鏈接庫。

因為我們的庫中使用了 libz 提供的 compress 函數,所以也提供了 -lz 選項,Libtool 會記住這個依賴關系,后續在使用我們的庫時自動的將依賴的庫鏈接進來。

上面的命令輸出如下 :

gcc -shared .libs/compress.o -lz -Wl,-soname -Wl,libcompress.so.0 -o .libs/libcompress.so.0.0.0 (cd .libs && rm -f libcompress.so.0 && ln -s libcompress.so.0.0.0 libcompress.so.0) (cd .libs && rm -f libcompress.so && ln -s libcompress.so.0.0.0 libcompress.so) ar cru .libs/libcompress.a compress.o ranlib .libs/libcompress.a creating libcompress.la (cd .libs && rm -f libcompress.la && ln -s ../libcompress.la libcompress.la)

可以看到,Libtool 自動的插入了建立動態鏈接庫需要的編譯選項 -shared。并且,它也建立了靜態鏈接庫 .libs/libcompress.a,后面我們將會介紹如何控制 Libtool 只建立需要的庫。

你可能會奇怪為什么建立的動態鏈接庫有 .0 和 .0.0.0 這樣的后綴,這里先不用理會它,后面在介紹 Libtool 庫版本信息時將會解釋這點。

值得注意的是,Libtool 希望后續使用 libcompress.la 文件而不是直接使用 libcompress.a 和 libcompress.so 文件,如果你這樣做,雖然可以,但會破壞 Libtool 庫的可移植性。

安裝 Libtool 庫

如果打算發布建立好的 Libtool 庫,可以使用下面的命令安裝它 :

$ libtool --mode=install install -c libcompress.la /tmp

我們需要告訴 Libtool 使用的安裝命令,Libtool 支持 install 和 cp,這里使用的是 install。

雖然前面我們在建立庫時,通過 -rpath 選項指定了庫準備安裝的路徑 (/tmp),但是這里我們還得要提供安裝路徑。請確保它們一致。

這個命令的輸出如下 :

install .libs/libcompress.so.0.0.0 /tmp/libcompress.so.0.0.0 (cd /tmp && { ln -s -f libcompress.so.0.0.0 libcompress.so.0 || { rm -f libcompress.so.0 && ln -s libcompress.so.0.0.0 libcompress.so.0; }; }) (cd /tmp && { ln -s -f libcompress.so.0.0.0 libcompress.so || { rm -f libcompress.so && ln -s libcompress.so.0.0.0 libcompress.so; }; }) install .libs/libcompress.lai /tmp/libcompress.la install .libs/libcompress.a /tmp/libcompress.a chmod 644 /tmp/libcompress.a ranlib /tmp/libcompress.a ...

可以看到它安裝了真實的動態鏈接庫和靜態鏈接庫,同時也安裝了 Libtool 庫文件 libcompress.la,這個文件可以被后續的 Libtool 命令使用。

在安裝完成之后,可能還需要做一些配置才能正確使用,Libtool 的 finish 模式可以在這方面給我們一些提示 :

$ libtool -n --mode=finish /tmp

這個命令的輸出有點長,所以不在這里列出,如果不能正常的使用安裝好的庫,請運行這個命令。

使用 Libtool 庫

要在應用程序中使用前面創建的 Libtool 庫很簡單,準備一個源文件 main.c,它將使用 libcompress.la 庫中定義的函數,代碼如下 :


清單 2: main.c
#include <stdio.h> extern int compress_file (const char *filename); int main (int argc, char *argv[]) { if (argc < 2) { printf ("usage : %s file\n", argv[0]); return 1; } return compress_file (argv[1]); }

我們還是要先為 main.c 建立 Libtool 對象文件,這和前面的方法一樣 :

$ libtool --mode=compile gcc -c main.c


使用安裝的庫
然后使用下面的命令鏈接執行文件 : $ libtool --mode=link gcc -o main main.lo /tmp/libcompress.la

我們也可以直接使用 libcompress.a 或者 libcompress.so,但是使用 Libtool 更加簡單,因為它會將幫助你解決依賴關系,例如我們的 libcompress 依賴 libz。

上面命令的輸出如下 :

gcc -o main .libs/main.o /tmp/libcompress.so -lz -Wl,--rpath -Wl,/tmp -Wl,--rpath -Wl,/tmp

這里,Libtool 自動選擇鏈接動態鏈接庫,并且加上了運行時需要的 --rpath 選項,以及依賴的庫 -lz。

如果要使用靜態鏈接庫,只需要加上?-static-libtool-libs選項即可,如下 :

$ libtool --mode=link gcc -o main main.lo /tmp/libcompress.la -static-libtool-libs

這個命令的輸出如下 :

gcc -o main .libs/main.o /tmp/libcompress.a -lz

" src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">使用未安裝的庫

也可以使用還沒有安裝的庫,這和使用安裝好的庫幾乎相同,只是指定的輸入文件位置不一樣,假如我們在同一個目錄中開發 compress.c 和 main.c,那么使用下面的命令 :

$ libtool --mode=link gcc -o main main.lo ./libcompress.la

和使用安裝的庫不一樣,這個時候建立的 main 程序只是一個封裝腳本,如果你直接執行它不會有什么問題,但是如果你想調試它,例如 :

$ gdb main

gdb 會報怨 main 不是可執行格式,不能接受。這個時候我們需要使用 Libtool 的執行模式,使用下面的命令調試程序 :

$ libtool --mode=execute gdb main

卸載 Libtool 庫

使用下面的命令可以卸載安裝的庫 :

$ libtool --mode=uninstall rm /tmp/libcompress.la

這個命令的輸出如下 :

rm /tmp/libcompress.la /tmp/libcompress.so.0.0.0 /tmp/libcompress.so.0 /tmp/libcompress.so /tmp/libcompress.a

這將刪除所有安裝的庫文件。

回頁首

Libtool 高級用法

這一節將對 Libtool 進行更加全面的描述,包括下面的內容 :

  • 創建可動態加載模塊 ;
  • 禁止創建動態或者靜態鏈接庫 ;
  • Libtool 命令模式 ;
  • 庫版本信息 ;

創建可動態加載模塊

有些高級的軟件系統在建立時不需要與特定的庫鏈接,而在運行時可以動態加載符合規范的庫,來提供額外的功能,這通常稱為插件系統。

可動態加載的庫和通常的庫有一些區別,它們可以通過?dlopen() 打開,并且可以通過?dlsym() 查詢它輸出的符號。

使用 Libtool 可以很容易的建立這樣的庫,還是以前面的 compress.c 為例,我們可以通過這樣的命令建立一個可動態加載模塊 :

$ libtool --mode=link gcc -o compress.la compress.lo -rpath /tmp -lz -module -avoid-version

這里添加了額外的兩個參數,-module告訴 Libtool 建立一個可動態加載的模塊,-avoid-version告訴 Libtool 不要添加版本號。

在 UNIX/Linux 系統中,庫通常以 lib 作為前綴,可在上面我們指定的輸出文件為?compress.la而不是 libcompress.la,這也是可動態加載模塊的一個特征,它不需要遵循通常的庫命名規則。

在實際應用中,可動態加載模塊通常會使用主程序提供的一些函數,為了滿足動態模塊的需求,在編譯主程序時,需要添加?-export-dynamic選項。

禁止創建動態或者靜態鏈接庫

大部分情況下,Libtool 都配置成同時創建動態鏈接庫和靜態鏈接庫??梢酝ㄟ^下面的命令查看 Libtool 的當前配置 :

$ libtool – features

它的輸出如下 :

host: i686-pc-linux-gnu enable shared libraries enable static libraries

可是有時侯,只想創建動態鏈接庫或者只想創建靜態鏈接庫,這需要修改 Libtool 自身。后面介紹 Libtool 結合 Autoconf 和 Automake 使用時,將有更加簡單的辦法。

" src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">禁止創建動態鏈接庫

Libtool 自身是一個安裝在 /usr/bin 目錄下的 Shell 腳本,為了修改它,我們需要將它復制到一個有修改權限的目錄,然后找到下面的兩行 :

52 # Whether or not to build shared libraries. 53 build_libtool_libs=yes

將 yes 改為 no。之后用這個修改過的 libtool 就不會創建動態鏈接庫。

還有其它幾個方法可以禁止創建動態鏈接庫,第一個方法是在鏈接時不提供 -rpath 選項,第二個方法是在鏈接時使用?-all-static選項,第三個方法是指定目標文件為 libcompress.a 而不是 libcompress.la。

" src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">禁止創建靜態鏈接庫

在 Libtool 腳本中找到下面兩行

55 # Whether or not to build static libraries. 56 build_old_libs=no

將 yes 改為 no。之后用這個修改過的 libtool 就不會創建靜態鏈接庫。

Libtool 命令模式

在前面,我們已經用到了 Libtool 的大部分命令模式,每個命令模式用于不同的階段,Libtool 根據當前的命令模式添加需要的編譯器選項。

Libtool 支持下面的幾個命令模式 :

  • 編譯模式 ;
  • 連接模式 ;
  • 安裝模式 ;
  • 完成模式 ;
  • 卸載模式 ;
  • 執行模式 ;
  • 清除模式 ;

每個命令模式對應開發中的不同階段,但并不是在每個項目中都需要使用上面所有的模式,例如一個不需要安裝的庫就不需要安裝和卸載模式。

" src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">編譯模式

編譯模式用于建立從源文件建立對象文件。它需要一個編譯器名稱作為第一個參數,并且還要提供 -c 選項,Libtool 將根據源文件名稱自動選擇目標文件名稱。如果是建立動態鏈接庫,它也會加入相應的選項,例如 -fPIC等等。

編譯模式使用示例 :

$ libtool --mode=compile gcc -c src.c

" src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">鏈接模式

鏈接模式用于建立 Libtool 庫或者可執行文件,如果輸出文件名稱以 .la 結尾,那么它將嘗試建立 Libtool 庫。如果輸出文件名稱以 .a 結尾,它就只建立靜態鏈接庫。如果輸出文件名稱以 .lo 或者 .o 結尾,則建立一個可重新加載的對象文件,這經常叫做部分鏈接。否則它就建立一個執行文件。

鏈接模式使用示例 :

$ libtool --mode=link gcc -o library.la src.lo -rpath /usr/local/lib

" src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">安裝模式

安裝模式用于安裝 Libtool 庫或者執行程序。它的第一個參數必須是 install 或者 cp,之后是要安裝的文件以及目標路徑。

安裝模式使用示例 :

$ libtool --mode=install install -c library.la /usr/local/lib

" src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">完成模式

完成模式是在安裝完 Libtool 庫之后,在使用之前進行適當的配置。finish 模式需要一個參數,即 Libtool 庫的安裝路徑。

完成模式使用示例 :

$ libtool --mode=finish /usr/local/lib

" src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">卸載模式

卸載模式用于卸載已經安裝的 Libtool 庫或者執行程序。

卸載模式使用示例 :

$ libtool --mode=uninstall rm /usr/local/lib/library.la

" src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">執行模式

執行模式用來執行應用程序,它在啟動應用程序之前自動的設置好庫的路徑。

執行模式使用示例 :

$ libtool --mode=execute gdb program

" src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">清除模式

清除模式和卸載模式差不多,只是它用來清除開發過程中的中間文件。

清除模式使用示例 :

$ libtool --mode=clean rm library.la

庫版本信息

和應用程序一樣,庫也需要不斷的升級,考慮一個第三方應用程序使用了我們之前發布的 libcompress?,F在我們對 libcompress 的性能進行了優化,并且提供了新的接口,所以我們又發布了這個新版本。

這引入了幾個問題,如果以前的應用程序采用靜態方式鏈接,那么如果它想使用新庫的功能,就必須用新庫重新鏈接應用程序。如果是采用動態鏈接方式,那么新庫安裝后,應用程序應該使用新庫還是舊庫呢?并且,如何避免新庫和舊庫之間的沖突呢?

庫版本號可以解決上述這些問題,一個動態鏈接庫有一個版本號,它在鏈接時硬編碼到動態鏈接庫中,當一個應用程序鏈接動態鏈接庫時,它也存儲了鏈接庫的版本信息,動態加載器 ( 如?ld-linux.so.2) 可以在程序啟動時正確的加載版本匹配的庫。

用?ldd命令可以查看應用程序使用的動態鏈接庫以及它們的版本信息 :

$ ldd .libs/lt-main linux-gate.so.1 => (0x00182000) libcompress.so.0 => /home/.../.libs/libcompress.so.0 (0x00c25000) libz.so.1 => /lib/libz.so.1 (0x00565000) libc.so.6 => /lib/libc.so.6 (0x003ad000) /lib/ld-linux.so.2 (0x0038d000)

我們需要用 .libs/lt-main 作為輸入文件,當前目錄下的 main 只是一個封裝腳本。從上面的輸出可以看到,main 程序依賴 libcompress.so 的版本 0。

" src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">庫接口

庫接口是 應用程序可以和庫交流的入口,常用的庫接口包括 :

  • 全局變量、結構體、常數 ;
  • 全局函數,包括參數類型、數量和返回類型 ;
  • socket、管道,以及其它進程間通訊的協議格式 ;

當然還有其它的接口。在設計和實現庫時,應該考慮盡量在將來減少庫接口的改變。

" src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">庫版本號

通常一個庫有兩個版本號,一個主版本號,一個次版本號,主版本號指示接口的改變,次版本號指示性能增強或者錯誤修復。但不是每個系統都是如此。

在前面的例子中我們可以看到,為動態鏈接庫 libcompress.so.0.0.0 建立了兩個符號鏈接 :

  • libcompress.so -> libcompress.so.0.0.0
  • libcompress.so.0 -> libcompress.so.0.0.0

其中 libcompress.so 是供鏈接器 ( 例如 ld) 使用的,它應該指向當前系統中 libcompress 的最新版本,這樣新程序總是可以鏈接最新的庫版本。

libcompress.so.0 是供動態加載器 ( 例如 ld-linux.so.2) 使用的,它應該指向當前系統中相同接口號 ( 這里是 0) 的最新版本,這樣動態鏈接器就可以加載相同接口最新的庫版本。

" src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">Libtool 庫版本號

每個系統的庫版本機制并不一樣,Libtool 通過一種抽象的版本機制,最終在創建庫時映射到具體的系統版本機制。

Libtool 的版本號分為 3 個部分 :

  • current: 表示當前庫輸出的接口的數量 ;
  • revision: 表示當前庫輸出接口的修改次數 ;
  • age: 表示當前庫支持先前的庫接口的數量,例如?age為 2,表示它可以和支持當前庫接口的執行文件,或者支持前面兩個庫接口的執行文件進行鏈接。所以?age應該總是小于或者等于?current。

Libtool 的庫版本通過參數?-version-info?current:revision:age指定,例如下面的例子 :

$ libtool --mode=link gcc -l libcompress.la -version-info 0:1:0

如果沒有指定,默認版本是 0.0.0。

注意,應該盡可能少的更新庫版本號,尤其是不能強行將庫版本號和軟件發行號保持一致,下面是更新庫版本號的幾個策略 :

  • 如果修改了庫的源代碼,那么應該增加?revision。這是當前接口的新的修訂版本。
  • 如果改變了接口,應該增加?current,將?revision重置為 0。這是接口的新版本。
  • 如果新接口是前面接口的超集 ( 前面的接口還是可用 ),那么應該增加?age。這是一個向后兼容的版本。
  • 如果新接口刪除了前面接口的元素,那么應該將?age重置為 0。這是一個新的,但是不向后兼容的版本。

" src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">避免版本信息

有些動態鏈接庫,例如可動態加載模塊,不需要版本號,這時可使用 Libtool 的?-avoid-version選項,例如下面的命令 :

$ libtool --mode=link gcc -o libcompress.la compress.lo -rpath /tmp -avoid-version

將只會創建一個 .so 結尾的動態鏈接庫,而沒有 .0.0.0 這樣的版本后綴。

回頁首

結合 Autoconf 和 Automake 使用 Libtool

在使用 Autoconf 和 Automake 的項目中使用 Libtool 更加容易,只需要添加或者修改幾個地方,后續由 Automake 來幫你正確的調用 Libtool。

和 Autoconf 和 Automake 一樣,當在其它主機上編譯發布的軟件包時,不需要安裝 Libtool。

我們以前面的 compress.c 文件為例,介紹如何將它轉換成一個 Autoconf/Automake/Libtool 項目。

建立 configure.ac

使用下面的命令建立一個 configure.ac 模板 :

$ autoscan

這將生成一個 configure.scan 文件,將它改名為 configure.ac。

在 AC_INIT() 之后加入下面幾行 :

# 初始話 Automake AM_INIT_AUTOMAKE([-Wall]) # 這是在 Autoconf 中使用 Libtool 唯一必須的宏 AC_PROG_LIBTOOL

在 AC_OUTPUT 之前加入幾行 :

# 告訴 Autoconf 通過 Makefile.in 自動生成 Makefile AC_CONFIG_FILES([Makefile])

建立 Makefile.am

建立一個 Makefile.am 文件,內容如下 :

# _LTLIBRARIES 是 Automake 支持 Libtool 的原語 lib_LTLIBRARIES = libcompress.la libcompress_la_SOURCES = compress.c # 可以通過 _LDFLAGS 傳遞選項給 Libtool libcompress_la_LDFLAGS = # 通過 _LIBADD 可以指定庫依賴關系 libcompress_la_LIBADD = -lz

注意上面用?lib_LTLIBRARIES,而不是?lib_LIBRARIES,這告訴 Automake 使用 Libtool 創建 Libtool 庫。

建立 configure 和 Makefile

用下面的命令建立幾個空文件 :

$ touch NEWS README AUTHORS ChangeLog

然后運行 :

$ autoreconf -i -s 這將建立 configure 腳本,運行它將得到 Makefile: $ ./configure

同時,configure 也建立了 libtool 腳本,后續 Automake 將使用這個 libtool 腳本,而不是系統的那個。

建立 Libtool 庫

現在已經有了 Makefile,我們只需要簡單的輸入 :

$ make

便可以創建 libcompress 了,這比手動調用 Libtool 要方便很多。

注意 Automake 自動為 Libtool 選擇了 -rpath 的路徑,這是跟隨 UNIX 系統習慣定義的,庫文件安裝到 $prefix/lib 目錄中,頭文件安裝到 $prefix/include 目錄中。我們可以通過 configure 腳本的?--prefix選項改變上面的 $prefix,也可以使用 configure 腳本的?--libdir明確的指定庫文件的安裝目錄。

" src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">靜態庫和動態庫

前面在 configure.ac 中的 AC_PROG_LIBTOOL 宏為 configure 腳本添加了兩個選項 :

  • --enable-static
  • --enable-shared

這兩個選項可以控制是否建立動態或者靜態鏈接庫,例如,如果只想建立動態鏈接庫,可以這樣運行 configure:

$ ./configure --enable-shared – disable-static

在開發過程中,禁止創建動態鏈接庫有幾個優勢 :

  • 編譯速度提高了,這可以節省時間 ;
  • 調試更加容易,因為不用處理任何動態鏈接庫引入的復雜性 ;
  • 你可以了解 Libtool 在只支持靜態鏈接庫的平臺的行為 ;

為了避免在 configure 時忘記?--disable-shared選項,你可以在 configure.ac 中 AC_PROG_LIBTOOL 之前加入一行 :

AC_DISABLE_SHARED

" src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">可動態加載模塊

Libtool 的 鏈接模式支持 -module選項,它用來建立一個可動態加載模塊,可以通過 Automake 將這個選項傳遞給 Libtool。只需要選項添加到 Makefile.am 中的?libcompress_la_LDFLAGS變量即可,所以,要建立可動態加載模塊,我們需要修改 Makefile.am:

libcompress_la_LDFLAGS = -module -avoid-version

修改 Makefile.am 之后,需要運行 Automake:

$ automake

這將重新生成 Makefile.in 文件,以至于 Makefile。

" src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">安裝 Libtool 庫

安裝 Libtool 庫非常的簡單,只需要運行 :

$ make install

" src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">卸載 Libtool 庫

和安裝 Libtool 庫同樣簡單 :

$ make uninstall

建立執行程序

通過 Automake 使用 Libtool 庫也非常容易,我們需要在 Makefile.am 中加入下面的幾行 :

bin_PROGRAMS = main main_SOURCES = main.c main_LDFLAGS = main_LDADD = libcompress.la

注意在建立 libcompress.la 是,我們通過 _LIBADD 指定依賴庫,而建立執行文件 main 時,我們通過 _LDADD 指定依賴庫,要記住這點區別。

也記得把前面為測試可動態加載模塊時修改的 libcompress_la_LDFLAGS 變量改回來 :

libcompress_la_LDFLAGS =

修改 Makefile.am 之后,需要運行 Automake 更新 Makefile.in:

$ automake

然后運行

$ make

就可以建立可執行程序 main。

調試執行程序

在結合 Autoconf 和 Automake 使用 Libtool 時,我們幾乎永遠都不會直接調用 Libtool,除了一個例外,那就是 Libtool 的執行模式。

例如我們在開發時要調試執行程序,可以使用下面的命令 :

$ libtool --mode=execute gdb main

如果直接使用 :

$ gdb main

gdb 會抱怨 main 的格式不可接受,因為使用 Libtool 建立的 main 只是一個封裝腳本,它最終啟動的是 .lib/lt-main。

回頁首

小結

本文檔描述了 GNU Libtool 解決的問題,它的工作方式,以及在實際工作中使用 Libtool 的方法。有興趣的讀者應該進一步參考 GNU Libtool 手冊獲得更詳細的信息。在安裝了 GNU Libtool 的系統中可以直接通過 info libtool 來查看手冊。


參考資料

學習

  • Shared libraries: 這篇 HOWTO 描述了 Linux 系統中動態鏈接庫名字、位置,以及使用動態鏈接庫相關的環境變量,可以在http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html查看。

  • Autoconf, Automake, Libtool: 這本在線書籍詳細描述了 GNU Autotools(Autoconf, Automake, Libtool) 之間的關系,以及如何在軟件項目中結合使用 GNU Autotools??梢栽?http://sources.redhat.com/autobook/?查看本書的在線版本,或者從http://sources.redhat.com/autobook/download.html下載。

  • GNU Libtool :可以在?http://www.gnu.org/software/libtool/從這里可以下載 GNU Libtool 的最新版本,閱讀在線手冊,或者下載 PDF 版本的手冊。

  • GNU Autoconf:GNU Autotool 解決了 UNIX 世界大部分常見的軟件移植性問題,它通過使用各種手段去探測當前操作系統的特征,以及系統中安裝的軟件包的特征,最后生成一個頭文件,定義各種各樣的宏來表示系統的特征。應用程序可以通過這個頭文件來針對不同的環境來進行開發??梢栽?http://www.gnu.org/software/autoconf/下載 Autoconf 最新版本的軟件包和手冊,或者查看在線手冊。

  • GNU Automake:GNU Automake 解決了編寫可移植 Makefile 的問題,它使用和 Makefile 規則不同的語法來描述軟件項目的依賴關系。其生成的 Makefile 通常比手工寫的 Makefile 更加規范,例如它總是包含 dist, install, uninstall 等等常用的 Makefile target。它支持幾種常見的語言,例如 Java, vala 等等??梢栽?http://www.gnu.org/software/automake/下載 Automake 最新版本的軟件包和手冊,或者查看在線手冊。

  • AIX and UNIX 專區:developerWorks 的“AIX and UNIX 專區”提供了大量與 AIX 系統管理的所有方面相關的信息,您可以利用它們來擴展自己的 UNIX 技能。

  • AIX and UNIX 新手入門:訪問“AIX and UNIX 新手入門”頁面可了解更多關于 AIX 和 UNIX 的內容。

  • AIX and UNIX 專題匯總:AIX and UNIX 專區已經為您推出了很多的技術專題,為您總結了很多熱門的知識點。我們在后面還會繼續推出很多相關的熱門專題給您,為了方便您的訪問,我們在這里為您把本專區的所有專題進行匯總,讓您更方便的找到您需要的內容。

  • AIX and UNIX 下載中心:在這里你可以下載到可以運行在 AIX 或者是 UNIX 系統上的 IBM 服務器軟件以及工具,讓您可以提前免費試用他們的強大功能。

  • IBM Systems Magazine for AIX 中文版:本雜志的內容更加關注于趨勢和企業級架構應用方面的內容,同時對于新興的技術、產品、應用方式等也有很深入的探討。IBM Systems Magazine 的內容都是由十分資深的業內人士撰寫的,包括 IBM 的合作伙伴、IBM 的主機工程師以及高級管理人員。所以,從這些內容中,您可以了解到更高層次的應用理念,讓您在選擇和應用 IBM 系統時有一個更好的認識。

?

轉載于:https://www.cnblogs.com/xuechao/archive/2012/01/14/2322531.html

總結

以上是生活随笔為你收集整理的转载:使用 GNU Libtool 创建库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

伊人官网 | 日本夜夜草视频网站 | 91麻豆精品国产91久久久更新时间 | 国产盗摄精品一区二区 | 在线黄色免费av | 精品在线观看免费 | 国产美女久久久 | 精品视频国产 | 国产中文字幕一区 | 在线小视频你懂得 | 99在线高清视频在线播放 | 99精品欧美一区二区 | 亚洲精品国产精品99久久 | 亚洲免费av网站 | 又黄又刺激的视频 | 亚洲 欧美日韩 国产 中文 | 激情偷乱人伦小说视频在线观看 | 国产不卡一 | 久久免费公开视频 | 久久久免费视频播放 | 久久不卡日韩美女 | 99精品视频在线播放免费 | 精品久久久久久久 | 91精品国产一区二区三区 | 久久无码精品一区二区三区 | 国产 亚洲 欧美 在线 | 超碰在线1 | 天天躁天天躁天天躁婷 | 91成人区 | 精品视频www | 免费观看的黄色片 | 久久久久久久电影 | 又黄又网站 | 久久午夜网| 久久久精华网 | 国产精品18久久久久久首页狼 | 一区二区三区免费在线观看 | 一级一片免费看 | 中文字幕电影高清在线观看 | 96av在线视频 | 亚洲精品视频在线 | 欧美日本高清视频 | 99久久婷婷国产综合亚洲 | 精品国自产在线观看 | 国产黄a三级| 五月婷影院 | 中文字幕网站 | 午夜av大片 | 91麻豆精品国产91久久久无需广告 | 久久九九免费视频 | 西西444www高清大胆 | 91精品国自产在线偷拍蜜桃 | 国产一区在线观看视频 | 久久99亚洲精品久久久久 | 中文av网站| 国产在线永久 | 国模精品一区二区三区 | 黄色资源在线观看 | 特级毛片爽www免费版 | 韩国av电影在线观看 | 国产精品视频永久免费播放 | 欧美污污网站 | 日韩免费专区 | 国内丰满少妇猛烈精品播 | 天天草天天插 | 国产成人精品一区二区三区免费 | 综合色婷婷 | 亚洲国产精品999 | 国产成人精品一区二区在线 | 国产在线黄色 | 中文字幕黄网 | 日韩综合视频在线观看 | 国产美女黄网站免费 | 亚洲精品乱码久久久久久蜜桃91 | 国产高清av免费在线观看 | 日韩精品视频免费专区在线播放 | www.夜夜操| 丁香婷婷激情网 | 日本在线观看中文字幕 | 欧美日本高清视频 | 欧美精品一区二区免费 | 成人黄色av网站 | 中文字幕欧美日韩va免费视频 | 91丨九色丨高潮 | 操碰av | 色婷婷综合五月 | 亚洲国产剧情 | 最近中文字幕完整视频高清1 | 欧美aaa大片 | 国产日本在线观看 | 99精品成人 | 中文字幕观看av | 免费观看黄色av | 欧美性成人 | 久久一区二区三区国产精品 | 国产精品免费一区二区三区在线观看 | 免费视频色 | 免费久久网 | 成人一区二区在线 | 午夜手机电影 | 美女视频又黄又免费 | av高清免费在线 | 国产一级视频免费看 | 中文字幕在线影视资源 | 激情一区二区三区欧美 | 国产成人精品亚洲 | 日韩在线播放欧美字幕 | 欧美成人影音 | 欧美aa一级| 精油按摩av| 狠狠色丁香婷综合久久 | 青青啪| 国产成人精品一区二区三区免费 | 免费精品国产va自在自线 | 91精品中文字幕 | 一个色综合网站 | 日韩免费电影网站 | 久久精品一区二区 | 在线观看中文字幕亚洲 | 国产色婷婷 | 亚洲三级精品 | av 在线观看 | 91视频在线看 | 干天天 | 国产精品成人av久久 | 国产精品久久婷婷六月丁香 | 国产专区精品视频 | 免费观看国产精品视频 | 国产福利精品视频 | 麻豆传媒在线视频 | 欧美日韩中文在线视频 | 天天艹日日干 | 在线免费黄色av | 日韩在线观看电影 | 精品视频国产 | 麻豆视频免费在线 | 少妇性aaaaaaaaa视频 | 欧美极度另类性三渗透 | 日本一区二区不卡高清 | 国产麻豆精品在线观看 | 久久看片网| 日本高清中文字幕有码在线 | 亚洲国产大片 | 99久久综合精品五月天 | 精品一区二区在线看 | 超碰大片 | 中文字幕国产精品 | 精品久久一级片 | 亚洲国产精品电影 | 日韩激情视频在线 | 亚洲国内精品在线 | 玖玖视频在线 | 91一区啪爱嗯打偷拍欧美 | 在线观看国产中文字幕 | 亚洲成a人片77777kkkk1在线观看 | 国产91精品高清一区二区三区 | 美女激情影院 | 久久精品女人毛片国产 | 久久精品视频在线看 | 国产999视频在线观看 | 久久婷婷开心 | 成人在线视频免费看 | 免费黄色在线播放 | 人人射人人射 | 91精品国产欧美一区二区成人 | 国产精品99久久久久人中文网介绍 | 亚洲综合在线观看视频 | 黄色性av| 色综合久久久久综合体桃花网 | 97在线视频观看 | 色五月激情五月 | 国产精品 日韩 | av黄免费看 | 日韩综合在线观看 | 日本公乱妇视频 | 亚洲精品白浆高清久久久久久 | 国产又粗又长又硬免费视频 | 97av.com| 97手机电影网 | 日日干天夜夜 | av成人亚洲 | 国产成人一区二区三区影院在线 | 久久国产视频网 | 亚洲精品国产综合99久久夜夜嗨 | 手机成人在线电影 | 国产精品国产三级在线专区 | 免费网站在线观看成人 | www四虎影院| 91九色视频网站 | 久久精品国产一区二区电影 | 国产黄色片免费在线观看 | 日韩欧美视频免费看 | 日韩久久精品一区二区 | 99精品在线 | 精品免费观看 | wwwav视频| 精品免费在线视频 | 一区二区三区免费在线观看视频 | 91色影院 | 伊香蕉大综综综合久久啪 | 欧美黄污视频 | 亚洲国产精品小视频 | 天天操天天添天天吹 | 日韩69视频| 激情婷婷欧美 | 久久人视频 | 精品9999 | 免费视频久久 | 国产麻豆果冻传媒在线观看 | 亚洲天堂自拍视频 | 欧美色图亚洲图片 | 国产精品原创 | 狠狠狠操| 国产精品免费观看国产网曝瓜 | 精品久久久久久亚洲综合网站 | av网站在线免费观看 | 久视频在线 | 成人免费ⅴa | 黄网站免费大全入口 | 久久成人精品电影 | 日本精品在线视频 | 免费观看视频的网站 | 色网站免费在线观看 | 国产精品美女久久久久久久网站 | 日本精品久久久一区二区三区 | 探花视频在线观看免费 | av色一区| 国产精品对白一区二区三区 | 久久手机免费视频 | 国产福利一区二区三区在线观看 | 五月婷婷黄色网 | 国产在线视频一区二区三区 | 久久av电影 | 欧美在线aaa| 久久久久高清 | 久久伊99综合婷婷久久伊 | 国产伦精品一区二区三区四区视频 | 免费日韩一级片 | 久久视频国产精品免费视频在线 | 丁香激情综合 | 夜夜夜精品 | 蜜桃传媒一区二区 | av一级久久| 欧美综合久久 | 久久天堂网站 | 夜色资源站wwwcom | 国产高清视频在线 | 日韩在线视频免费播放 | www激情久久| 久久国精品 | 91麻豆国产福利在线观看 | 欧美激情综合五月色丁香 | 国产精品一区二区久久精品爱涩 | 亚洲撸撸 | 国产精品不卡在线观看 | 免费在线色电影 | 日韩精品中文字幕在线观看 | 黄色资源在线 | 一级黄色电影网站 | 久操中文字幕在线观看 | 在线看国产日韩 | 国产一区二区三区网站 | 免费色网站 | 免费网站看v片在线a | 久久国产免费视频 | 一区在线观看 | 亚洲精品久久在线 | 国精产品999国精产品视频 | 精品久久一二三区 | 亚洲午夜久久久综合37日本 | 伊人婷婷在线 | 久久精品久久久久久久 | 福利视频一区二区 | 国产第一页福利影院 | 国产99黄| 久久国产精品一区二区三区 | 三上悠亚一区二区在线观看 | 久草在线视频在线 | 美女久久久 | 中文字幕资源在线观看 | 久草在线视频网站 | 国产精品视频永久免费播放 | av一级片网站 | 久草在 | 婷婷干五月 | 日日干天天爽 | 在线播放视频一区 | 亚洲一级电影在线观看 | 黄色免费大片 | 四虎成人精品在永久免费 | 99国产精品一区 | 91精品国产入口 | 久久中文欧美 | 一级α片 | 六月婷婷久香在线视频 | 97精品国产97久久久久久春色 | 精品一区二区三区香蕉蜜桃 | 精品产品国产在线不卡 | 日韩精品视频在线观看免费 | 97超碰精品 | 亚洲 欧美 成人 | 久久久久久久久久久久电影 | 99热精品久久 | 超碰97在线看 | 天操夜夜操 | 久久久www成人免费精品 | 日韩乱码中文字幕 | 久草在线在线视频 | 波多野结衣电影一区二区 | 热久久视久久精品18亚洲精品 | 精品国精品自拍自在线 | 免费中文字幕 | 不卡的av | 国产精品一区二区三区免费视频 | 久久久国产一区 | 国产一性一爱一乱一交 | 在线看国产一区 | 中文字幕91视频 | 国产高清免费观看 | 99爱这里只有精品 | 91精品网站在线观看 | 久久国产精品系列 | 天天干天天拍天天操天天拍 | 美女免费网视频 | 国产真实在线 | 久久综合射 | 1000部18岁以下禁看视频 | 韩国av一区 | 91欧美日韩国产 | 中文字幕第 | 香蕉视频91 | 天天操网址 | 中文字幕色站 | 一级做a视频 | 国产精品原创av片国产免费 | 亚洲女欲精品久久久久久久18 | 最近免费中文视频 | 免费在线观看视频a | 色综合久久久久 | 9色在线视频 | 天天色天天干天天 | 日狠狠 | 国产精品av久久久久久无 | 久久精品99国产精品 | 三级黄色网络 | 美女网站在线 | 日产乱码一二三区别在线 | 国产麻豆成人传媒免费观看 | 色狠狠操 | 久久精品国产v日韩v亚洲 | 99国产精品视频免费观看一公开 | 精品色综合 | 亚洲美女在线一区 | 国产精品一区二区av | 夜夜操天天操 | 久久综合国产伦精品免费 | 午夜av免费| 日韩黄色影院 | 夜夜操天天干, | 国产精品久久久久免费 | 麻豆国产电影 | 9草在线| 欧美日本高清视频 | 成+人+色综合 | 成人一区二区三区在线观看 | 国产精品免费视频网站 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 99精品在线视频观看 | 亚洲在线免费视频 | 色婷婷激婷婷情综天天 | www久久九 | 麻豆免费在线视频 | 精品9999 | 四虎成人精品在永久免费 | 亚洲男男gaygay无套同网址 | 91成人免费视频 | 国产精品久久久久国产精品日日 | 久久首页 | 日韩精品视频第一页 | 日韩午夜小视频 | 中文字幕亚洲精品在线观看 | 日本公妇色中文字幕 | 97在线视频观看 | 一区二区三区四区在线免费观看 | 国产精品免费久久久久 | 午夜精品视频一区二区三区在线看 | 欧美日韩午夜在线 | 91久久精品一区二区三区 | 亚洲三区在线 | 国产视频每日更新 | 五月天激情视频在线观看 | 国产亚洲一级高清 | 亚洲国产av精品毛片鲁大师 | 中文国产在线观看 | 99视频在线看 | 成人国产亚洲 | 成年人免费在线看 | 九九在线精品视频 | 欧美福利片在线观看 | 一区二区久久 | 国产色婷婷精品综合在线手机播放 | 开心丁香婷婷深爱五月 | 国产日韩在线看 | 中文字幕高清有码 | 激情文学丁香 | 精品嫩模福利一区二区蜜臀 | 国产亚洲婷婷免费 | 亚a在线| 亚洲精品动漫在线 | 亚洲成人午夜在线 | 日本少妇高清做爰视频 | 午夜男人影院 | av黄色成人 | 一级片免费视频 | 成人黄色在线视频 | 亚洲最新av在线网址 | 这里只有精彩视频 | 综合久色 | 国产成人精品一区二区三区 | 国产一区二区手机在线观看 | 狠狠狠综合 | 国产香蕉97碰碰碰视频在线观看 | 久综合网 | 91麻豆文化传媒在线观看 | 久久精品99 | 草久在线观看视频 | 国产高清视频免费观看 | av色图天堂网 | 成人在线黄色 | 久久久www成人免费精品张筱雨 | 国产精品一区二区在线播放 | 视频国产精品 | 中文字幕在线有码 | 亚洲综合狠狠干 | 欧美a级免费视频 | 亚洲精品一区二区精华 | 国产a级片免费观看 | 欧美人人 | 久久成人精品 | 99热在线观看 | 国产欧美精品在线观看 | 最新在线你懂的 | av在线中文| 91精品国产99久久久久久久 | 色欧美88888久久久久久影院 | 欧美视频18 | 亚洲欧美日韩精品久久奇米一区 | 一区 二区 精品 | 色综合天天综合 | 国产精品毛片一区二区 | 欧美污在线观看 | 成片视频在线观看 | 91麻豆精品国产91久久久久久 | 国产成人99av超碰超爽 | 欧美国产91 | 色婷婷免费 | 亚洲成色777777在线观看影院 | 国产玖玖精品视频 | 五月激情丁香婷婷 | 日韩精品一区二区三区第95 | 欧美日韩视频网站 | 欧美日韩中文字幕视频 | 久久精品视频免费播放 | 久久久久久久久精 | 亚洲欧洲精品一区二区精品久久久 | 国产黄色av影视 | 美女视频又黄又免费 | 国产午夜三级一区二区三 | 亚洲永久国产精品 | 日韩中文字幕电影 | 亚洲国产精品一区二区久久hs | 综合五月婷婷 | 在线视频中文字幕一区 | 免费观看性生活大片 | 2024av | 六月婷婷色 | 免费一级片久久 | 色偷偷88欧美精品久久久 | 在线观看日本高清mv视频 | 五月天中文字幕 | 欧美人体xx | 一级免费看| 日韩成人黄色 | 日本中文字幕一二区观 | 久久你懂的 | 欧美日韩国产综合一区二区 | 黄色三级免费网址 | 亚洲成人免费在线 | 免费在线国产 | 国产v欧美 | 亚洲美女免费视频 | 国产精品女人网站 | 欧美国产不卡 | 91插插插免费视频 | 国产精品 999 | 国产精品99久久久久 | 久久毛片网站 | 国产午夜三级一区二区三桃花影视 | 国产99久久久精品 | 国产成人精品一区二区三区在线观看 | 日韩精品国产一区 | 99在线视频免费观看 | 超碰国产人人 | 日韩成人免费电影 | 国产精品一区二区精品视频免费看 | 操操色 | 狠狠狠干 | 亚洲乱码中文字幕综合 | 国产小视频在线看 | 久久久久欠精品国产毛片国产毛生 | 国产精品大尺度 | 日韩黄色中文字幕 | av成人亚洲| 亚洲综合色视频 | 天天干天天摸天天操 | 国产在线视频一区二区 | 伊人导航 | 狠狠色丁香久久婷婷综 | 国产很黄很色的视频 | 午夜电影 电影 | 国产专区在线 | 又黄又刺激的网站 | 亚洲 欧洲 国产 日本 综合 | 91视频 - 114av| 日韩电影精品 | 亚洲91中文字幕无线码三区 | 免费久久久久久 | 日韩精品一卡 | 亚洲香蕉在线观看 | 一区二区电影在线观看 | 久久99精品久久久久久秒播蜜臀 | 日韩三级视频在线看 | 久久亚洲美女 | 一本一本久久aa综合精品 | 国产黄色免费电影 | 99人久久精品视频最新地址 | 91精品国产91热久久久做人人 | 免费黄色在线网址 | 国产韩国日本高清视频 | 91久久精品一区二区二区 | 国内精品久久久久久久97牛牛 | 中文字幕一区二区三区久久蜜桃 | 色干综合 | 天天色天天综合 | 久久久久久激情 | 五月天堂色 | 超碰com | 美女久久 | 欧美日韩视频网站 | 91九色在线视频观看 | 国产涩涩网站 | 最新中文字幕视频 | 成人动态视频 | 久久精品5 | 天天操综合网站 | 精品国产一区二区三区在线观看 | 国产护士av| 中文字幕在线观看视频网站 | 久久香蕉国产 | 免费在线色视频 | 日韩中文字幕在线观看 | 精品国产伦一区二区三区观看方式 | www天天干| 97视频在线观看免费 | 亚州国产精品视频 | www.看片网站 | 国产精品久久人 | 久草免费在线观看 | 很黄很黄的网站免费的 | 黄色片亚洲 | 友田真希av| 精品日韩视频 | 91激情视频在线观看 | 综合网色 | 国产精品乱码久久 | 久久久久久久99精品免费观看 | 美女精品 | www.五月天激情 | 91精品视频免费观看 | 亚洲激情在线播放 | 2023av在线| 91av视频在线观看 | 中文字幕视频在线播放 | 国产成人精品一区二区在线观看 | 久久免费的视频 | 亚在线播放中文视频 | 日韩在线观看视频在线 | 91成人免费 | 久草在线在线 | 精品毛片一区二区免费看 | 99久久99久久精品国产片果冰 | 国产精品久久久久久久久大全 | 久久精品久久精品久久39 | 精品视频123区在线观看 | 激情黄色av | 久久麻豆精品 | 日韩二三区 | 日韩精品免费在线播放 | 日韩精品视| 日本三级不卡视频 | 国产精品麻豆欧美日韩ww | 国产在线精 | 亚洲夜夜爽 | 婷婷六月天综合 | 国产一区私人高清影院 | 久久草av | 国产精品18久久久久久久 | 97在线免费 | 欧美在线视频a | 国产黄色免费在线观看 | 亚洲欧美成人网 | 黄色小说视频在线 | 久久精品五月 | 97福利视频 | 欧美日韩一区二区在线观看 | 夜夜骑日日操 | 欧美精品首页 | 亚洲精品影视 | 99精品视频在线免费观看 | 国产又粗又猛又黄又爽 | 久久色视频 | 国产综合在线视频 | 92国产精品久久久久首页 | 天天干夜夜操视频 | 国产在线精品福利 | 91精彩视频 | 少妇精69xxtheporn| a在线v| 久久露脸国产精品 | 成人国产精品一区二区 | 亚洲成 人精品 | 激情av网址| 国产99精品 | 久久玖| 91自拍91| 国产成人精品av在线 | 国产99免费视频 | 国产最新视频在线观看 | av电影中文字幕在线观看 | 亚洲五月综合 | 麻豆免费视频 | 最新在线你懂的 | 日韩精品视频在线免费观看 | 久久婷婷国产 | 国产女v资源在线观看 | 亚洲精品三级 | www.久艹 | 午夜视频导航 | 9999免费视频 | 国产高清久久 | 久久精国产 | 天天干天天做 | 国产一区二区高清视频 | 蜜臀久久99精品久久久久久网站 | 九色91av| 国产麻豆精品传媒av国产下载 | 久久高清国产视频 | 久久激情视频免费观看 | 91视频在线网址 | 久久精品国产成人精品 | 中文字幕在线观看2018 | 亚洲免费永久精品国产 | 国产精品观看视频 | av不卡免费在线观看 | 久操视频在线观看 | 亚洲精品一区二区网址 | 伊人宗合网 | 精品 激情 | 久久爱影视i | 亚洲国产成人精品在线观看 | 国产色在线观看 | 国产91在线 | 美洲 | 日本女人b | 国产成人免费在线 | 亚洲国产中文字幕在线观看 | 日日天天 | 狠狠躁夜夜躁人人爽超碰91 | 久久久久久久久网站 | 久久久久久久久久久国产精品 | 91看片在线免费观看 | 国产精品一区二区久久精品 | 99国内精品 | 伊人小视频 | 东方av在线免费观看 | 国产老太婆免费交性大片 | 国产又粗又猛又爽又黄的视频免费 | www五月天com | 成人高清av在线 | 人人网av | 精品电影一区二区 | 99日精品| 久久综合狠狠综合久久狠狠色综合 | 五月婷婷六月丁香在线观看 | 三级黄色大片在线观看 | 久久精品韩国 | 亚洲欧洲av | 91色视频 | 久久久www成人免费精品张筱雨 | 免费视频久久久久 | 久久久久亚洲最大xxxx | 国产精品久久久久久久久久久久冷 | 97视频在线观看成人 | 亚洲精品美女在线观看播放 | av线上看 | 日韩激情精品 | 久久婷婷五月综合色丁香 | 色网免费观看 | 免费看一级特黄a大片 | 久久久这里有精品 | 中文资源在线官网 | 中文字幕在线网址 | 四虎在线观看 | 久艹在线观看视频 | 欧美久草视频 | 天天草av | 久久黄色免费 | 国产999精品久久久影片官网 | 麻豆视频成人 | 国产 精品 资源 | 色婷婷电影| av电影在线免费 | 天操夜夜操 | 伊人五月在线 | 国产黄色一级大片 | 欧美-第1页-屁屁影院 | 在线91av| avove黑丝 | www.色婷婷.com | 日日干av | 青春草视频在线播放 | 国产手机精品视频 | 日日干天天| 亚洲天天看 | 久久久91精品国产一区二区三区 | 免费男女羞羞的视频网站中文字幕 | 九色激情网 | 超碰免费av | 久久这里只有精品视频首页 | 九九热免费在线观看 | 天天天综合网 | 日韩欧美精品在线 | 中文资源在线播放 | 最新日韩视频 | 中文字幕精 | 亚洲国产影院 | 天天五月天色 | 欧美,日韩 | 午夜 在线 | 亚洲激情五月 | 蜜桃视频色 | 激情婷婷亚洲 | 又粗又长又大又爽又黄少妇毛片 | 免费看黄在线看 | 国产va在线 | 狠狠操狠狠干天天操 | 三级黄色在线 | 在线免费观看黄色 | 国产黄色在线观看 | 国产精品第2页 | 日韩欧美一区二区不卡 | 91资源在线免费观看 | av在线播放国产 | 国产精彩视频一区二区 | 91片网 | 欧美男女爱爱视频 | 国产午夜一区二区 | 97国产在线观看 | 久草在线手机视频 | 国产视频一二三 | 久久久久免费精品国产小说色大师 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 亚洲精品视频在线免费 | 久久精品视频在线播放 | 欧美专区日韩专区 | 久久这里精品视频 | 国产欧美精品一区二区三区 | 丁香九月婷婷综合 | 亚洲国产精品久久久久久 | 成 人 黄 色 视频 免费观看 | 91尤物在线播放 | 久久99精品国产麻豆宅宅 | www.玖玖玖| 国产精品免费视频观看 | 久久久久免费精品国产小说色大师 | 久草网在线视频 | 国产在线美女 | 这里只有精品视频在线观看 | 日韩成人免费观看 | 久久欧美综合 | 久久视了 | av黄色国产 | 搡bbbb搡bbb视频 | 免费看日韩| 成年人黄色大片在线 | 91精品一区国产高清在线gif | 在线免费亚洲 | 免费a v在线 | 视频高清 | 亚洲最新av在线网址 | 欧美视频在线观看免费网址 | 日韩69av | 国产欧美精品一区二区三区 | 一区二区精品 | 中文视频在线看 | 日韩女同一区二区三区在线观看 | 国产精品1024 | 亚洲精品中文字幕视频 | 六月婷婷久香在线视频 | 亚洲精品久久久久久国 | 日韩欧美黄色网址 | 亚洲视频一 | 久久精品国产免费 | 丁香婷婷综合五月 | 亚洲国产精品日韩 | 亚洲精品黄网站 | 日韩h在线观看 | 精品视频专区 | 国产一区二区久久久久 | 日韩在线观看一区二区三区 | 久久久久久久久国产 | 久久香蕉电影 | 超级碰碰碰免费视频 | a'aaa级片在线观看 | 国产福利一区二区三区在线观看 | 国产999精品视频 | 国产小视频你懂的在线 | 亚洲污视频 | 丁香九月激情 | 中文字幕成人在线 | 久久精品久久99精品久久 | 国产亚洲精品久久久久动 | 五月婷婷国产 | 国产免费一区二区三区网站免费 | 精品视频在线免费观看 | 欧美a免费 | 国产小视频在线免费观看视频 | 国产免费黄视频在线观看 | 丝袜少妇在线 | 人人揉人人揉人人揉人人揉97 | 亚洲国产午夜视频 | 久久精品这里都是精品 | 久久精品亚洲一区二区三区观看模式 | 午夜三级在线 | 人人澡超碰碰97碰碰碰软件 | 这里只有精彩视频 | 国模视频一区二区三区 | 午夜国产福利在线 | 播五月婷婷 | www.91成人| 欧美性猛片 | 探花国产在线 | av成人动漫 | av一级片网站| 久久99九九99精品 | 黄色片网站大全 | 色婷婷av在线 | 国产成人三级在线 | 国产女v资源在线观看 | 成人综合免费 | 91完整版在线观看 | 91字幕| 成人一区二区三区在线 | 午夜av片 | 91久久国产综合精品女同国语 | 日本女人在线观看 | 亚洲激情 欧美激情 | 成人综合日日夜夜 | 香蕉视频在线播放 | 国产精品一区二区久久精品爱涩 | 日韩视频 一区 | 国产成人精品三级 | 日韩欧美一区二区三区视频 | 中文字幕 国产专区 | 97电影院网 | www.日本色 | 丝袜网站在线观看 | 最新不卡av | 在线看国产日韩 | 91热这里只有精品 | 国产精品一区二区三区久久 | 天天操天天操天天操天天 | 国产精品久久久久影院日本 | 久久国产精品一二三区 | 婷婷开心久久网 | 久久婷婷综合激情 | 久久黄色精品视频 | 中文字幕亚洲国产 | 九九免费观看全部免费视频 | 四虎www| 亚洲永久精品国产 | 国产精品视频资源 | 国产尤物在线观看 | 亚洲精品乱码久久久久久9色 | 超碰在线94 | 国产美女在线观看 | 久久这里有精品 | 天天干天天做 | 中文字幕在线观看日本 | 91久久精品日日躁夜夜躁国产 | 久久久精品高清 | 亚洲精品视频在线观看免费 | 色综合天 | 青春草国产视频 | 国产成人精品一二三区 | 亚洲精品一区二区三区新线路 | 91成人精品一区在线播放69 | 亚洲欧美婷婷六月色综合 | 波多野结衣一区二区 | 免费三级影片 | 特级a老妇做爰全过程 | 国产精品国产三级国产aⅴ9色 | 久久久久免费精品视频 | 能在线看的av | 91在线资源 | 中文不卡视频在线 | av色综合网| 51精品国自产在线 | 2024国产精品视频 | 中文字幕123区 | 欧美黑人xxxx猛性大交 | 中文字幕国产视频 | 成年人在线观看免费视频 | 久久97精品 | 国产91精品久久久久久 | 国产福利小视频在线 | 久久精品日本啪啪涩涩 | 国产精品久久久久久69 | 999精品| 欧美另类v | 一区二区三区四区五区在线 | 天天草天天干天天射 | 久久在线看 | 手机在线中文字幕 | 国产一区二区不卡在线 | 特级黄色一级 | 91日韩在线视频 | 美女网站在线观看 | 99视 | 成人在线播放网站 | 在线免费看黄网站 | 成人黄色电影在线观看 | 日本系列中文字幕 | 日韩在线高清视频 | 免费a v视频| 国产精品theporn | 亚洲国产精品久久久久 | 亚洲资源在线观看 | 在线视频 成人 | 亚洲国产中文字幕在线观看 | 91视频国产高清 | 视频在线日韩 | 久久久免费精品 | 激情自拍av | av在线之家电影网站 | 国产精品一区二区在线免费观看 | 中文区中文字幕免费看 | 欧美一区二区免费在线观看 | 欧美激情第十页 | 毛片美女网站 | 天天躁天天操 | 日韩免费看 | 人人爽人人爽人人片av免 | 五月激情丁香婷婷 | 久久久婷 | 五月天伊人网 | 97超碰国产精品女人人人爽 | 久久男人视频 | 日日干激情五月 | 在线高清av | 久久久久久久免费 | 亚洲精品在线免费观看视频 | 亚洲高清激情 | 毛片网站在线 | 午夜精品久久久久久99热明星 | 久草视频手机在线 | 最近高清中文字幕 | 久久久久久久久久久久电影 | 国产精品一区二区麻豆 | 亚洲国产欧美一区二区三区丁香婷 | 在线观看av国产 | 日韩av在线一区二区 | 精品一区 精品二区 | 99电影| a级国产乱理论片在线观看 伊人宗合网 | 欧美aaa级片| 国产99色 | 色婷婷激情五月 | 成人av资源在线 | 在线欧美日韩 | 九九热免费在线观看 | 中文字幕高清av | 99婷婷狠狠成为人免费视频 | 久久精品视频中文字幕 | 麻豆一二| 中文字幕在线观看免费高清完整版 | 在线播放你懂 | 99久久99热这里只有精品 | 久久国产精品免费看 |