交叉编译-configure配置

配置configure.ac

用自动生成Makefile的工具来生成Makefile的过程中,需要用autoscan命令来生成configure.scan文件,然后将它改名字为configure.ac或者configure.in,然后就来更改其中的一些相关信息来完成下面需要完成的配置,那么这个configure.ac怎么来写?今天我们就将这个过程分开来和大家共同研究和探讨下。

我们在生成的过程中会用autoconf命令来处理configure.ac/configure.in文件,生成一个configure的脚本。生成后的configure文件是一个可以移植的shell脚本,运行的时候它检查编译环境,来决定哪些库是可以用的,所用到的平台有哪些个特征,那些个头文件和库是已经找到的等等, 然后收集到的这些信息,它修改编译标记,生成一个Makefile文件,同时生成一个包含已定义的预处理符号的config.h文件。configure并不需要运行autoconf,所以我们在发布应用程序之前生成这个文件,如此我们就不必有autoconf的软件包了。

AC_INIT总是configure.in中的第一个宏。它扩展为许多可由其他configure脚本共享的模板文件代码。这些代码解析传到 configure中的命令行参数。这个宏的一个参数是一个文件名,这个文件应该在源代码目录中,它用于健全性检查,以保证configure脚本已正确定位源文件目录。

AM_CONFIG_HEADER指定了要创建的头文件,差不多总是config.h。创建的头文件包含由configure定义的C预处理符号。最低限度应该定义PACKAGE和VERSION符号,这样可以将应用程序名称和版本传送到代码中,而无须对它们硬编码(非公用的源文件应该包含 config.h(#include)以利用这些定义。然而,不要将config.h文件安装到系统中,因为它有可能与其他的软件包冲突)。

AM_INIT_AUTOMAKE初始化automake。传到这个宏里的参数是要编译的应用程序的名称和版本号(这些参数成为config.h中定义的PACKAGE和VERSION值)。

AM_MAINTAINER_MODE关闭缺省时仅供程序维护者使用的makefile目标,并修改以使configure能理解 –enable-maintainer-mode选项。–enable-maintainer-mode将maintaineronly目标重新打开。仅供维护者使用的makefile目标允许最终用户清除自动生成的文件,比如configure,这意味着要修复编译故障,必须安装有autoconf和automake软件。注意,因为autogen.sh脚本主要是给开发人员用的,autogen.sh会自动传递一个–enable- maintainer-mode选项给configure。

AM_ACLOCAL_INCLUDE指定一个附加的目录,用于搜索m4宏。在这里,它指定为macros子目录。在这个目录中应该有Gnome宏的拷贝。

GNOME_INIT给configure添加一个与Gnome相关的命令行参数个数,并为Gnome程序定义一些makefile变量,这些变量中包含了必要的预处理程序和链接程序标志。这些标志是由gnome-config脚本取得的。安装gnome-libs时会安装gnome- config脚本。

AC_PROG_CC定位C编译器。

AC_CHECK_LIB如果程序中加入了多线程用到的锁的话就要加入像 AC_CHECK_LIB([pthread], [main])这样的检测,这个宏的含义如下:

交叉编译-configure配置_第1张图片

LIBS是link的一个选项,程序中使用了读写锁,所以要测试pthread库中是否存在pthread_rwlock_init函数。

AC_PROG_RANLIB如果是多线程的程序的话要加入这句话,要不运行automake命令时会出错。

AC_ISC_POSIX添加一些在某些平台上实现POSIX兼容需要的标志。

AC_HEADER_STDC检查当前平台上是否有标准的ANSI头文件,如果有,则定义STDC_HEADERS。

AC_ARG_PROGRAM添加一些选项到configure中,让用户能够修改安装程序的名称(如果在用户系统上碰巧有一个与要安装的程序名称相同的程序,这是很有用的)。

AM_PROG_LIBTOOL是由automake用来设置libtool的用途的。只在计划编译共享库或动态可加载模块时才需要设置这个值。

GNOME_COMPILE_WARNINGS给gcc命令行添加许多警告选项,但是在其他绝大多数的编译器上什么也不做。

ALL_LINGUAS=“es”不是一个宏,只是一句shell代码。它包含一个由空格分隔的语言种类缩写表,对应于po子目录下的.po文件。.po文件包含翻译成其他语言的文本,所以ALL_LINGUAS应该列出程序已经被翻译成的所有语言。

 

另外 配置configure时后缀参数可选择

--host=HOST
是指定软件运行的系统平台.如果没有指定,将会运行`config.guess'来检测.

--build=BUILD
是指定软件包安装的系统平台.如果没有指定,默认值将是'--host'选项的值.

--target=GARGET
是指定软件面向(target to)的系统平台.这主要在程序语言工具如编译器和汇编器上下文中起作用.如果没有指定,默认将使用'--host'选项的值. 


 --prefix=/work/gaoht/gsoap/target
是指定软件安装的位置

一般而言,我们只要指定 --host 就可以了
记住:--host 指定的是交叉编译工具链的前缀

 LDFLAGS="-L/usr/non-standard-path/python/lib"

编译流程

交叉编译
确保交叉编译工具链的bin文件在PATH环境变量里,请先透过命令检查下,如果不在,需要手动添加进来。

确认OK之后,查看GCC等相关编译工具的前缀, 这个需要在执行configure时,指定host的

#echo $PATH
/usr/local/bin:/bin:/usr/bin:/opt/xxx/bin/
#ls /opt/xxx/bin/
arm-brcm-linux-gnueabi-addr2line  arm-brcm-linux-gnueabi-gcov     arm-brcm-linux-gnueabi-strip  arm-linux-gccbug            arm-linux-size              arm-linux-uclibc-gcc        arm-linux-uclibc-readelf
arm-brcm-linux-gnueabi-ar         arm-brcm-linux-gnueabi-gprof    arm-linux-addr2line           arm-linux-gcov              arm-linux-strings           arm-linux-uclibc-gcc-4.2.3  arm-linux-uclibc-size
arm-brcm-linux-gnueabi-as         arm-brcm-linux-gnueabi-ld       arm-linux-ar                  arm-linux-gprof             arm-linux-strip             arm-linux-uclibc-gccbug     arm-linux-uclibc-strings
arm-brcm-linux-gnueabi-c++        arm-brcm-linux-gnueabi-nm       arm-linux-as                  arm-linux-ld                arm-linux-uclibc-addr2line  arm-linux-uclibc-gcov       arm-linux-uclibc-strip
arm-brcm-linux-gnueabi-c++filt    arm-brcm-linux-gnueabi-objcopy  arm-linux-c++                 arm-linux-ldd-VK-copy-test  arm-linux-uclibc-ar         arm-linux-uclibc-gprof      mkfs.jffs2
arm-brcm-linux-gnueabi-cpp        arm-brcm-linux-gnueabi-objdump  arm-linux-c++filt             arm-linux-nm                arm-linux-uclibc-as         arm-linux-uclibc-ld         ncurses5-config
arm-brcm-linux-gnueabi-g++        arm-brcm-linux-gnueabi-ranlib   arm-linux-cpp                 arm-linux-objcopy           arm-linux-uclibc-c++        arm-linux-uclibc-nm         sumtool
arm-brcm-linux-gnueabi-gcc        arm-brcm-linux-gnueabi-readelf  arm-linux-g++                 arm-linux-objdump           arm-linux-uclibc-c++filt    arm-linux-uclibc-objcopy
arm-brcm-linux-gnueabi-gcc-4.2.3  arm-brcm-linux-gnueabi-size     arm-linux-gcc                 arm-linux-ranlib            arm-linux-uclibc-cpp        arm-linux-uclibc-objdump
arm-brcm-linux-gnueabi-gccbug     arm-brcm-linux-gnueabi-strings  arm-linux-gcc-4.2.3  
#./configure --host=arm-brcm-linux-gnueabi
#make

查看make的log

 
[~/Signature/SRC/libbmp-0.1.3]$ make clean;make
Making clean in build
make[1]: Entering directory `/home/lumi/Signature/SRC/libbmp-0.1.3/build'
rm -rf .libs _libs
rm -f *.lo
make[1]: Leaving directory `/home/lumi/Signature/SRC/libbmp-0.1.3/build'
Making clean in test
make[1]: Entering directory `/home/lumi/Signature/SRC/libbmp-0.1.3/test'
 rm -f bmptest
rm -rf .libs _libs
rm -f *.o
rm -f *.lo
make[1]: Leaving directory `/home/lumi/Signature/SRC/libbmp-0.1.3/test'
Making clean in src
make[1]: Entering directory `/home/lumi/Signature/SRC/libbmp-0.1.3/src'
test -z "libbmp.la" || rm -f libbmp.la
rm -f "./so_locations"
rm -rf .libs _libs
rm -f *.o
rm -f *.lo
make[1]: Leaving directory `/home/lumi/Signature/SRC/libbmp-0.1.3/src'
Making clean in .
make[1]: Entering directory `/home/lumi/Signature/SRC/libbmp-0.1.3'
rm -rf .libs _libs
rm -f *.lo
make[1]: Leaving directory `/home/lumi/Signature/SRC/libbmp-0.1.3'
make  all-recursive
make[1]: Entering directory `/home/lumi/Signature/SRC/libbmp-0.1.3'
Making all in src
make[2]: Entering directory `/home/lumi/Signature/SRC/libbmp-0.1.3/src'
/bin/bash ../libtool --tag=CC   --mode=compile arm-brcm-linux-gnueabi-gcc  -DHAVE_CONFIG_H -I. -I..     -g -O2 -MT bmpfile.lo -MD -MP -MF .deps/bmpfile.Tpo -c -o bmpfile.lo bmpfile.c
libtool: compile:  arm-brcm-linux-gnueabi-gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT bmpfile.lo -MD -MP -MF .deps/bmpfile.Tpo -c bmpfile.c  -fPIC -DPIC -o .libs/bmpfile.o
libtool: compile:  arm-brcm-linux-gnueabi-gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT bmpfile.lo -MD -MP -MF .deps/bmpfile.Tpo -c bmpfile.c -o bmpfile.o >/dev/null 2>&1
mv -f .deps/bmpfile.Tpo .deps/bmpfile.Plo
/bin/bash ../libtool --tag=CC   --mode=link arm-brcm-linux-gnueabi-gcc   -g -O2 -version-info 101:2:101 -lm  -o libbmp.la -rpath /usr/local/lib bmpfile.lo
libtool: link:  arm-brcm-linux-gnueabi-gcc  -shared  .libs/bmpfile.o   -lm    -Wl,-soname -Wl,libbmp.so.0 -o .libs/libbmp.so.0.101.2
libtool: link: (cd ".libs" && rm -f "libbmp.so.0" && ln -s "libbmp.so.0.101.2" "libbmp.so.0")
libtool: link: (cd ".libs" && rm -f "libbmp.so" && ln -s "libbmp.so.0.101.2" "libbmp.so")
libtool: link: arm-brcm-linux-gnueabi-ar cru .libs/libbmp.a  bmpfile.o
libtool: link: arm-brcm-linux-gnueabi-ranlib .libs/libbmp.a
libtool: link: ( cd ".libs" && rm -f "libbmp.la" && ln -s "../libbmp.la" "libbmp.la" )
make[2]: Leaving directory `/home/lumi/Signature/SRC/libbmp-0.1.3/src'
Making all in test
make[2]: Entering directory `/home/lumi/Signature/SRC/libbmp-0.1.3/test'
arm-brcm-linux-gnueabi-gcc  -DHAVE_CONFIG_H -I. -I.. -I../src    -g -O2 -MT test.o -MD -MP -MF .deps/test.Tpo -c -o test.o test.c
mv -f .deps/test.Tpo .deps/test.Po
/bin/bash ../libtool --tag=CC   --mode=link arm-brcm-linux-gnueabi-gcc   -g -O2   -o bmptest test.o ../src/libbmp.la
libtool: link: arm-brcm-linux-gnueabi-gcc -g -O2 -o .libs/bmptest test.o  ../src/.libs/libbmp.so -lm
make[2]: Leaving directory `/home/lumi/Signature/SRC/libbmp-0.1.3/test'
Making all in build
make[2]: Entering directory `/home/lumi/Signature/SRC/libbmp-0.1.3/build'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/home/lumi/Signature/SRC/libbmp-0.1.3/build'
make[2]: Entering directory `/home/lumi/Signature/SRC/libbmp-0.1.3'
make[2]: Leaving directory `/home/lumi/Signature/SRC/libbmp-0.1.3'
make[1]: Leaving directory `/home/lumi/Signature/SRC/libbmp-0.1.3'

你可能感兴趣的:(知识汇总学习总结,linux,服务器)