Cross Compile libpng

来源:互联网 发布:局域网语音通讯软件 编辑:程序博客网 时间:2024/05/01 18:54
PNG,是一种图形文件格式,英文名称为Portable Network Graphics,即便携式网络图片。具体的介绍请访问wiki的介绍:PNG

首先从libpng主页下载最新的源码,解压并进入目录。

在配置前先看看配置选项:
./configure --help
选项太多,只介绍一些要用的:
Installation directories:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [/usr/local]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [PREFIX]
这两个选项太熟了,安装位置的配置。

Fine tuning of the installation directories:
  --bindir=DIR            user executables [EPREFIX/bin]
  --sbindir=DIR           system admin executables [EPREFIX/sbin]
  --libexecdir=DIR        program executables [EPREFIX/libexec]
......
一大堆安装目录设置选项,一般默认就好,不用设置。

Program names:
是设置安装的文件名称,默认就好。

System types:
  --build=BUILD     configure for building on BUILD [guessed]
  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
这两个选项在交叉编译时还是配置一下比较好。


Optional Features:这里比较重要,是编译时用的一些配置选项,比较重要的是以下两个,但是默认是打开的,所以也不用配置。
  --enable-shared[=PKGS]  build shared libraries [default=yes]
  --enable-static[=PKGS]  build static libraries [default=yes]


Optional Packages:里面是一些与别的包编译配置的选项,此次不使用。

Some influential environment variables:
  CC          C compiler command
  CFLAGS      C compiler flags
  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
              nonstandard directory <lib dir>
  LIBS        libraries to pass to the linker, e.g. -l<library>
  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
              you have headers in a nonstandard directory <include dir>
  CPP         C preprocessor
以上的选现地球人都知道的编译选项,如果依赖的包的位置不在默认的位置的话,那你就必须设置其中的一些了。
如果是交叉编译,那就必须设置CC了。

还有,libpng依赖zlib,所以你必须先编译好zlib,并放在编译器找得到地方,或是在设置时加上CFLAGS="-I******" 和 LDFLAGS="-L*******"。 
这里有我交叉编译的记录:Cross Compile zlib 

这次我将zlib库文件放在了交叉编译工具链默认的库文件夹里了,所以不用设置了,以后用起来也方便。


我的配置是:
CC=arm-9tdmi-linux-gnu-gcc ./configure --prefix=$PREFIX --host=arm-9tdmi-linux-gnu 

然后就是make;make install。

之后会在$PREFIX下出现一下结构:
|-- bin
|   |-- libpng-config -> libpng12-config
|   `-- libpng12-config
|-- include
|   |-- libpng12
|   |   |-- png.h
|   |   `-- pngconf.h
|   |-- png.h -> libpng12/png.h
|   `-- pngconf.h -> libpng12/pngconf.h
|-- lib
|   |-- libpng.a -> libpng12.a
|   |-- libpng.la -> libpng12.la
|   |-- libpng.so -> libpng12.so
|   |-- libpng.so.3 -> libpng.so.3.35.0
|   |-- libpng.so.3.35.0
|   |-- libpng12.a
|   |-- libpng12.la
|   |-- libpng12.so -> libpng12.so.0.35.0
|   |-- libpng12.so.0 -> libpng12.so.0.35.0
|   |-- libpng12.so.0.35.0
|   `-- pkgconfig
|       |-- libpng.pc -> libpng12.pc
|       `-- libpng12.pc
`-- share
    `-- man
        |-- man3
        |   |-- libpng.3
        |   `-- libpngpf.3
        `-- man5
            `-- png.5

其中真正需要拷贝到开发板上的是lib中的共享库文件,其他的文件在软件开发时才用得着。以下一一介绍:

libpng12-config:是一个获得库文件存放位置和库信息的脚本,里面存放的是和你刚刚配置的$PREFIX有关的位置。
include 中的是编译其他依赖libpng的软件时提供的头文件
pkgconfig 文件夹中的.pc文件也是提供库文件存放位置和库信息的文件,是给pkg-config工具准备的,编译软件时使用的。
对于.pc文件和pkg-config工具的介绍,请看:
关于pkg-config和libtool的相关知识链接

我交叉编译完都会将头文件、库文件、“.pc”文件和“.la”文件放在交叉编译工具链默认的库文件夹里(记得修改“.pc”文件和“.la”文件中的库路径哦),或者可以在安装一次到交叉编译工具链默认的库文件夹,以后编译其他软件时用起来也方便。