libjpeg庫和libpng庫的移植和使用


目錄
1、libjpeg庫移植
2、zlib庫移植
3、libpng庫移植
4、開源庫的使用方法
1、libjpeg庫移植
【1】下載源碼與准備交叉工具鏈
libjpegv6下載地址

【2】解壓源碼並進入解壓后的目錄

【3】配置

./configure --prefix=/opt/libdecode --exec-prefix=/opt/libdecode --enable-shared --enable-static -build=i386 -host=arm
1
注:/opt/libdecode為自定義的目錄,用來存放庫生成的各種庫和頭文件

【4】修改 Makefile

CC=gcc 改為 CC=arm-linux-gcc
AR=ar rc 改為 AR=arm-linux-ar rc
AR2=ranlib 改為  AR2=arm-linux-ranlib
1
2
3
【5】確認是否存在/opt/libdecode /include與/opt/libdecode/lib兩個目錄,若不存在則創建。

【6】make && make install-lib

注:移植jpegsrc.v9.tar.gz時,使用以下的配置

./configure --prefix=/opt/libdecode --host=arm-none-linux-gnueabi
1
【7】庫的使用

安裝完成后,可以在 /opt/libdecode/include 目錄中找到libjpeg的頭文件,以后在編譯包含了libjpeg的工程時,必須指定 -I /opt/libdecode/include,同時在鏈接時需指定 -L /opt/libdecode/lib,若為動態鏈接,則必須將/opt/libdecode/lib 中的so文件拷貝到運行時環境,且使用export LD_LIBRARY_PATH 將之導出到環境變量。

2、zlib庫移植
【1】源碼下載網址為:zlib1.2.8

【2】解壓並進入目錄

tar -xvf zlib-1.2.8.tar.gz
1
【3】導出CC以確定配置時為arm-linux-

export CC=arm-linux-gcc
1
【4】配置zlib庫,得到Makefile

./configure -shared --prefix=/opt/libdecode
1
【5】make && make install

指定庫安裝目錄為/opt/libdecode,交叉編譯后得到的zlib共享庫文件放到了/opt/libdecode/lib中,頭文件放到了/opt/libdecode/include中,man手冊放到了/opt/libdecode/share/man下

3、libpng庫移植
【1】libpng源碼下載libpng1.6.6

【2】解壓並進入目錄

tar -xvf libpng-1.6.6.tar.gz
1
【3】配置

export LDFLAGS="-L/opt/libdecode/lib"
export CFLAGS="-I/opt/libdecode/include"
export CPPFLAGS="-I/opt/libdecode/include"
./configure --host=arm-linux --enable-shared --enable-static --prefix=/opt/libdecode
1
2
3
4
【4】make && make install

【5】如果在進行配置前並未按照2中所述安裝zlib,則配置運行了一部分后,會報錯:

configure: error: zlib not installed
1
錯誤提示zlib庫未安裝,原因是libpng庫依賴於zlib庫。因此在編譯libpng前必須先安裝zlib(注意安裝的是交叉編譯的zlib,而不是給x86平台下使用的zlib)。

【6】指定庫安裝目錄為/opt/libdecode,交叉編譯后得到的libpng共享庫文件放到了/opt/libdecode/lib中,頭文件放到了/opt/libdecode/include中,man手冊放到了/opt/libdecode/share/man下

【7】頭文件拷貝
進入/opt/libdecode/include中可以看到,默認安裝時已經拷貝了png.h pnglibconf.h pngconf.h三個頭文件。但是實際做png解碼顯示圖片時發現,只有上述三個頭文件(實際上只有png.h有用到)是不夠的,還需要另外兩個頭文件pngstruct.h和pnginfo.h。
在libpng源碼目錄下執行以下兩條指令,將兩個頭文件人為拷貝過去以備使用即可。

cp pnginfo.h /opt/libdecode/include/
cp pngstruct.h /opt/libdecode/include/
1
2
4、開源庫的使用方法
【1】移植
(源碼下載、解壓、配置、修改Makefile、編譯或交叉編譯)。移植的目的是由源碼得到三個東西:動態庫.so,靜態庫.a,頭文件.h

【2】部署動態庫以使程序運行起來

第一種情況:放到/lib或者/usr/lib下,這樣不需要給系統指定庫路徑,就能自動找到。
第二種情況:有時候對於一些不常用的庫,我們不願意將他放到lib或usr/lib目錄下去,而是找個自定義的第三方的目錄,單獨將這些不常用的庫放置,然后再用一定方法告訴操作系統去到這個路徑下加載這個庫。將該自定義第三方目錄導出到環境變量LD_LIBRARY_PATH下即可。
【3】部署動態鏈接庫一般有三個位置可以考慮:

第一個:/lib 如:cp /opt/libdecode/lib/*so* /x210_porting/rootfs/rootfs/lib
第二個:/usr/lib 如:cp /opt/libdecode/lib/*so* /x210_porting/rootfs/rootfs/usr/lib
第三個:任意指定目錄如/opt/mylib,其做法如下
cd /x210_porting/rootfs/rootfs/opt/mylib
cp /opt/libdecode/lib/*so* ./
1
2
在開發板端export LD_LIBRARY_PATH=/opt/mylib:$LD_LIBRARY_PATH
echo $LD_LIBRARY_PATH
看見/opt/mylib: 即可
1
2
3
(注:我們制作的開發板在Ubuntu掛載的文件系統我的路為:/x210_porting/rootfs/rootfs/)

【4】使用(部署動態庫so、部署靜態庫.a和頭文件.h)

動態庫是運行時環境需要的,編譯程序時不需要。
靜態庫是靜態連接時才需要,動態鏈接時不需要。
頭文件.h是在編譯程序時使用的,運行時不需要的。
所以動態庫so文件是要放到開發板的文件系統中去的(放的過程就叫部署),把靜態庫.a文件和頭文件.h文件放到ubuntu的文件系統中去。
【5】注意三個編譯鏈接選項:-I(大i) -l(小L) -L

-I(大i)是編譯選項(准確的是說是預處理選項CFLAGS或者CPPFLAGS中指定),用來指定預處理時查找頭文件的范圍的。
-l(小L)是鏈接選項(LDFLAGS中指定),用來指定鏈接額外的庫(譬如我們用到了數學函數,就用-lm,鏈接器就會去鏈接libm.so;那么我們使用了libjpeg,對應的庫名字就叫libjpeg.so,就需要用-ljpeg選項去鏈接)
-L是鏈接選項(LDFLAGS中指定),用來告訴鏈接器到哪個路徑下面去找動態鏈接庫。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM