运行./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<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
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
configure和交叉编译
原创jiangjqian ©著作权
©著作权归作者所有:来自51CTO博客作者jiangjqian的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
Go程序的交叉编译
Go程序的交叉编译是每一位GO程序猿必须掌握的知识点。但是我没有。在昨天,我编译了一个项目,生成了二进制,放到目标机器上,执行报错,错误如下:bash: ./api.linux: cannot execute binary file: Exec format error提示很明显,可执行文件格式错误,不能执行二进制文件。直接定位到了,是目标机器的内核跟我的Macbook Pro不匹配;接着在目标系
cannot execute binar Exec format error GOARCH GO交叉编译 aarch64 -
交叉编译android 交叉编译原理
首先说说交叉编译的事:一个简单的Hello World程序,在x86_64的机器上编译通过后,将其生成的可执行程序拷贝到aarch64的机器上去执行,肯定是执行不通过的, 会报文件格式不正确之类的错误,这是因为程序的编译平台环境和程序的运行平台环境不同导致的,x86_64的机器CPU是amd64架构的(复杂指令集),而aarch64机器的CPU是arm架构的(精简指令
交叉编译android 交叉编译 Qt交叉编译 aarch64 aarch64-linux-gnu-gc