运行./configure --help
通过configure可以配置很多信息,下面挑几个重要的选项进行描述。
--prefix=PREFIX
配置安装路径,要用绝对路径。
make install时会把可执行文件,配置文件或库安装到目录下的对应目录中,如bin/,lib/等
--build=BUILD
编译所在的环境
--host=HOST
程序运行的环境对应的交叉编译器
Optional Packages:
--with-PACKAGE
在自由软件社区里,有使用已有软件包和库的优秀传统.当用'configure'来配置一个源码树时,可以提供其他已经安装的软件包的信息.例如,倚赖于Tcl和Tk的BLT器件工具包.要配置BLT,可能需要给'configure'提供一些关于我们把Tcl和Tk装的何处的信息:
$ ./configure --with-tcl=/usr/local --with-tk=/usr/local
其它关键是环境变量,包括:
CC C compiler command
CFLAGS C compiler flags
LDFLAGS linker flags, e.g. -L if you have libraries in a
nonstandard directory
LIBS libraries to pass to the linker, e.g. -l
CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if
you have headers in a nonstandard directory
CPP C preprocessor
PKG_CONFIG path to pkg-config utility
LIBXML2_CFLAGS
C compiler flags for LIBXML2, overriding pkg-config
LIBXML2_LIBS
linker flags for LIBXML2, overriding pkg-config
注意,pkg-config
pkg-config用来检索系统中安装库文件的信息。
一般来说,如果库的头文件不在/usr/include目录中,那么在编译的时候需要用-I参数指定其路径。由于同一个库在不同系统上可能位于不同的目录下,用户安装库的时候也可以将库安装在不同的目录下,所以即使使用同一个库,由于库的路径的不同,造成了用-I参数指定的头文件的路径和在连接时使用-L参数指定lib库的路径都可能不同,其结果就是造成了编译命令界面的不统一。可能由于编译,连接的不一致,造成同一份程序从一台机器copy到另一台机器时就可能会出现问题。
pkg-config 就是用来解决编译连接界面不统一问题的一个工具。
它的基本思想:pkg-config是通过库提供的一个.pc文件获得库的各种必要信息的,包括版本信息、编译和连接需要的参数等。需要的时候可以通过pkg-config提供的参数(–cflags, –libs),将所需信息提取出来供编译和连接使用。这样,不管库文件安装在哪,通过库对应的.pc文件就可以准确定位,可以使用相同的编译和连接命令,使得编译和连接界面统一。
它提供的主要功能有:
<1> 检查库的版本号。如果所需库的版本不满足要求,打印出错误信息,避免连接错误版本的库文件。
<2> 获得编译预处理参数,如宏定义,头文件的路径。
<3> 获得编译参数,如库及其依赖的其他库的位置,文件名及其他一些连接参数。
<4> 自动加入所依赖的其他库的设置。
在默认情况下,每个支持 pkg-config 的库对应的.pc文件在安装后都位于安装目录中的lib/pkgconfig目录下。例如,我们在上面已经将Glib安装在/opt/gtk目录下了,那么这个Glib库对应的.pc文件是 /opt/gtk/lib/pkgconfig目录下一个叫glib-2.0.pc的文件.
Apollo对应的安装是:
${_TMTGTBUILDROOT}/comps/generic_apps/usr/lib/pkgconfig
所以下面是一个正确的fongconfig编译时的shell脚本,运行sh shell.sh
#!/bin/sh
OUTPUT_PREFIX=${_TMTGTBUILDROOT}/comps/generic_apps/usr
GEN_APPS_DIR=${_TMTGTBUILDROOT}/comps/generic_apps
export CC="arm-linux-uclibcgnueabi-gcc --sysroot ${_TMSYSROOT}"
export LDFLAGS="--sysroot ${_TMSYSROOT} -L${GCC_BASE}/lib -L${_TMTGTBUILDROOT}/comps/generated/lib/armgnu_linux_el_cortex-a9 -L${GEN_APPS_DIR}/usr/lib"
export PKG_CONFIG="${OUTPUT_PREFIX}/lib/pkgconfig"
export CPPFLAGS="--sysroot ${_TMSYSROOT} -I${KSRC}/include -I${GCC_BASE}/include
-I${OUTPUT_PREFIX}/include ${BUILD32}
-I${OUTPUT_PREFIX}/include/freetype2
-I${OUTPUT_PREFIX}/include/freetype2/freetype -DBSP_LITTLE_ENDIAN=1 -I${KSRC}/arch/arm/include
-I${_TMROOT}/inc
-I${NXP_BASE_ROOT}/target/output/objs/${KERNEL_CONFIG}/include
-I${GEN_APPS_DIR}/usr/include"
./configure --build=i686-linux --host=arm-linux --with-arch=arm