autoconf 源码编译 ./configure

本篇主要讲已经存在一个autoconf 管理的源码,怎么将其编译成功

AUTOCONF和AUTOMAKE

  • AUTOCONF和AUTOMAKE是非常有用的用来发布C程序的东西.AUTOCONF产生AUTOMAKE
  • 典型的程序安装步骤要用到GNU的AUTOCONF和AUTOMAKE
  • 这里使用autoconf 和 automake 做了 软件包,该软件包可以用 ./configure && make && make install 来编译安装
  • 但是并不是所有autoconf发布的软件包都是这样子的
还有一种软件包
	没有./configure
	只有 configure.ac 和 Makefile.am
这种包的编译安装办法
	1. autoreconf 来 生成 configure
	2. 然后用 ./configure && make && make install 来做

version issue

sudo apt install autoconf2.69
sudo apt install automake1.11

ln -sf /usr/bin/autoconf2.69      ~/bin/autoconf
ln -sf /usr/bin/autoheader2.69    ~/bin/autoheadr
ln -sf /usr/bin/autom4te2.69      ~/bin/autom4te
ln -sf /usr/bin/autoreconf2.69    ~/bin/autoreconf
ln -sf /usr/bin/autoscan2.69      ~/bin/autoscan
ln -sf /usr/bin/autoupdate2.69    ~/bin/autoupdate
ln -sf /usr/bin/ifnames2.69       ~/bin/ifnames
ln -sf /usr/bin/aclocal-1.11      ~/bin/aclocal
ln -sf /usr/bin/automake-1.11     ~/bin/automake

编译流程

1/
  阅读 README 或者 INSTALL
2/
  ./configure //一般后面要加很长的参数
3/
  make

1/阅读README或者INSTALL

一般这样的文件里面都有些怎么编译及安装

2/运行configure脚本


不要想当然的从网上的教程找来一条运行命令,出错了,说没有选项,不知道怎么办

去 运行 ./configure -h 查看支持的选项

指定参数,执行configure脚本
  • 效果:产生各个文件夹下的Makefile及其他文件

  • 通过运行的时候加一些选项来生成与默认配置不同的Makefile,一般目的是为了裁剪软件,因为软件太大,或者某些功能我们不需要,所以可以通过加一些选项来禁止掉我们不需要的功能

  • configure脚本

    configure脚本位于待安装程序源码根目录下面
    configure脚本是用来检测你的安装平台的目标特征的.它会对你的系统做很多的测试,以用来检测出你的安装平台的目标特征,比如它会检测你是不是有CC或GCC
    configure脚本有大量的命令行选项,对不同的软件包来说,这些选项可能会有变化,但是许多基本的选项是不会改变的.
    使用’./configure --help’命令就可以看到可用的所有选项,尽管许多选项是很少用到的,但是当你为了特殊的需求而配置一个包时,这些选项是必不可少的.
    configure: POSIX shell script, ASCII text executable, with very long lines
    -rwxr-xr-x 1 root root 730195 2月 5 2004 configure *
    Usage: ./configure [OPTION]… [VAR=VALUE]…

  • 不是所有的源码里面都有configure文件,有些源码包里面没有configure,但是有直接写好的Makefile

  • 参数

    1.1配置区【Configuration】


    这块内容主要是对./configure脚本本身运行的过程进行配置,如是否显示运行结果给用户,是否创建cache文件啊。很少配置

	--cache-file=FILE
		'configure'会在你的系统上测试存在的特性(或者bug!),为了加速随后进行的配置,测试的结果会存储在一个cache file里,尤其当configure一个复杂的源码树时,一个很好的cache file的存在会对性能有很大帮助。
	--no-create
		'configure'中的一个主要函数会制作输出文件(./Makefile),此选项阻止'configure'生成这个文件,你可以认为这是一种演习(dry run),尽管缓存(cache)仍然被改写了。

​ 1.2程序安装目录区【Installation directories】

​ configure脚本中经常被配置的选项区,这里的主要作用就是配置你要安装的软件的安装后的目录,默认情况下(用户没有主动配置),./configure会将软件安装在/usr/local/bin/和/usr/local/lib/等目录下面。

//如果你想指定你安装的程序的具体目录,就用这2个选项,他们之间的区别就只有是否平台相关性。通过指定这2个选项后,你的程序就完全的被安装在你指定的目录下面了,此时以后删除该程序,只需要简单的移除该目录下所有内容就可以了。
	--prefix=PREFIX         install architecture-independent files in PREFIX [/usr/local]
	--exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX  [PREFIX]
//你想进一步指定软件安装后的具体目录(如可执行文件的目录,共享库的目录等),你可以使用如下选项来配置.(只举3个例子)
	--bindir=DIR            user executables [EPREFIX/bin]
	--libdir=DIR            object code libraries [EPREFIX/lib]
	--includedir=DIR        C header files [PREFIX/include]

​ 1.3程序名称区【Program names】

​ 如果你想改变安装后程序的名称,如你安装qq程序,但是你不想称呼它为“qq“,而想叫它为“360”,那么可以通过下面这些选项来配置了。

	--program-prefix=PREFIX            prepend PREFIX to installed program names
	--program-suffix=SUFFIX            append SUFFIX to installed program names
	--program-transform-name=PROGRAM   run sed PROGRAM on installed program names

​ 1.4系统类型区【System types】

​ 一个程序开发完成以后,对源代码进行编译,将编译后的文件发布出去形成所谓的各个平台的安装版本(非开源的都是这么干的,开源的也可以这样编译后不同运行平台的编译版本),这就是所谓的交叉编译。下面介绍有关这平台相关性的选项。

--build=BUILD     configure for building on BUILD [guessed]
    通过--build选项来指定执行代码编译工作的主机,通常该值默认是cofig.guess(该shell脚本和./configure在同一目录)来猜即可(一般就是你执行编译操作的主机),
    当然你也可以通过这个选项指定具体的值。

--host=HOST       cross-compile to build programs to run on HOST [BUILD] 
	编译的程序在什么机器上运行是由--host选项指定的,其默认值都是--build,当两者不一样的时候就是所谓的交叉编译。
	--host=arm-linux arm
	--host=arm-none-linux-gnueabi
    
--target=TARGET   configure for building compilers for TARGET [HOST]
	--target选项用来配置编译工具,它只有在建立交叉编译环境的时候用到,正常编译和交叉编译都不会用到。
	他用--build主机上的编译器,编译一个新的编译器(binutils, gcc,gdb等),这个新的编译器将来编译出来的其他程序将运行在target指定的系统上。
	如果没有指定,默认将使用’–host’选项的值.
	

​ 1.5可选特性区【Optional Features】
​ 当你想在./configure时使用某个特性的时候,可以来配置该区块中的选项值,它主要分为disable和enable两大类

//当你想禁用某个FEATURE的时候可以使用它(尤其是某些软件可能默认开启某些特性,而实际上你是不需要的),例如:--disable-gui  --disable-shared
	--disable-FEATURE
//当你想禁用某个FEATURE的时候可以使用它(尤其是某些软件可能默认开启某些特性,而实际上你是不需要的),例如:$ ./configure --disable-gui
//`--enable-FEATURE=no'与上面提到的'--disable-FEATURE'是同义的
//一些软件包可能提供了一些默认被禁止的特性,这时你可以使用“--enable-FEATURE“来起用它,一个特性可能会接受一个可选的参数值。例如:--enable-buffers=128  --enable-shared[=PKGS] build shared libraries [default=yes]
	-enable-FEATURE[=ARGUMENT]

​ 1.6可选安装包区【Optional Packages】
​ 软件的包安装的时候,可能会存在依赖。加上a软件依赖于b软件,那么在安装a软件的时候,必须要先安装b软件,而此时b软件偏偏不在系统的默认查询目录(即系统无法查询到,或者你不想使用系统默认的b软件而想使用你自己安装的b软件(整个系统有2个b软件)),你就可用通过with选项来指定具体的软件包地址,通过without选项来指定不使用指定的软件包。

//通过without选项来指定不使用指定的软件包。--without-gnu-ld
   --without-PACKAGE
//'--with-PACKAGE=no'与将提到的'--without-PACKAGE'是同义的.
   --with-PACKAGE[=ARGUMENT]

​ 1.7影响安装的环境变量区【Some influential environment variables】
​ 这块主要是影响编译器的编译环境变量。

//指明交叉编译器的路径 CC=/usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-gcc
	CC          C compiler command

​ 1.8其他信息


3/make

在运行configure脚本之后,已经产生了 makefile,直接make就可以了.
  
  
- 效果:根据Makefile编译源代码,连接,生成目标文件,可执行文件。
- 目标为all,因为all是第一个目标,所以make 和make all 一个效果
- make 工具一般是修改当前目录,及当前目录下的目录,所以不用加sudo,如果有权限问题,则可以用chown 命令 修改当前目录的所属用户
- 某些源码里面make 会产生时间戳,所以make 会产生一些.h文件,以至于 make -n 会报错


./configure 遇到的问题

但是往往不是一番风顺,可能会遇到各种各样的问题.
1/
  可能需要的依赖包没安装
2/
  可能编译器版本和源码不适配
3/
  makefile 的tab 问题
4/
  源码需要修改
  
  • 这个步骤在某些源码移植中是不用的,因为我们可以用./configure 加一些选项生成可以被make直接解析的Makefile,但有时候我们修改Makefile是为了修改编译器并适配编译器的选项,因为部分configure没有适配编译器
  • 某些make 编译的时候需要设置环境变量,我还没有遇到过这种情况
  • 如果修改的话
/*针对arm平台*/
CC=/home/linux/gcc-4.6.4/bin/arm-none-linux-gnueabi-gcc
LDSHARED=/home/linux/gcc-4.6.4/bin/arm-none-linux-gnueabi-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map
CPP=/home/linux/gcc-4.6.4/bin/arm-none-linux-gnueabi-gcc -E
AR=/home/linux/gcc-4.6.4/bin/arm-none-linux-gnueabi-ar rc
RANLIB=/home/linux/gcc-4.6.4/bin/arm-none-linux-gnueabi-ranlib
/*适配编译器*/
删除Makefile中的-fforce-mem,因为arm-none-linux-gnueabi-gcc不支持该参数
/*针对其他平台*/
大概也是这些东西,具体问题,具体分析.
这些东西是需要搜索的,都是探索着一部一部做出来的
注意:一定要完善路径

其他

./configure 生成文件

config.log 文件
	是在运行 configure 脚本时生成的日志文件,它记录了 configure 脚本在检查系统环境时的详细信息,包括环境变量、编译器、库、头文件、路径等。
	如果在运行 configure 时出现了错误,可以通过查看 config.log 文件来找到错误的原因。

config.status 文件
	是在运行完 configure 脚本后生成的文件,它包含了根据当前系统环境和用户的输入生成的 Makefile 文件。
	当用户执行 make 命令时,实际上是在运行 config.status 文件中定义的命令来编译和安装软件。
	如果用户修改了 configure 脚本中的选项,可以重新运行 config.status 文件来更新 Makefile 文件。

make clean 与 make distclean


make clean:
	清除编译产生的可执行文件及目标文件(object file,*.o)

make distclean:
	除了清除可执行文件和目标文件外,把configure所产生的Makefile也清除掉。

make dist

将程序和相关的档案包装成一个压缩文件以供发布。
执行完在目录下会产生一个以PACKAGE-VERSION.tar.gz为名称的文件。 
PACKAGE和VERSION这两个变数是根据configure.in文件中AM_INIT_AUTOMAKE(PACKAGE,VERSION)的定义。
在此范例中会产生test-1.0.tar.gz的档案。

make distcheck

和makedist类似,但是加入检查包装后的压缩文件是否正常。
这个目标除了把程序和相关文件包装成tar.gz文件外,还会自动把这个压缩文件解开,执行 configure,并且进行make all 的动作,确认编译无误后,会显示这个tar.gz文件可供发布了。
这个检查非常有用,检查过关的包,基本上可以给任何一个具备GNU开发环境的人去重新编译。

注意

1. 一定要确保上一步完成之后才能做下一步
2. 出问题去找度娘
3. 有时候移植一个源码需要另一些源码生成的.h和动态链接文件
4. 不同的configure 有不同的配置选项,虽然意思一样,但是表现形式不同
5. make之后,再次make前最好执行make clean .不clean,就不会清除上次编译结果。再make,也许会将上次的结果link进来。当然,makefile写的好也许不会。clean一下更保险。

关于卸载

很多source的Makefile都有写uninstall目标,直接在Souce里make uninstall(make install & make clean)就可行.
如果作者没写,那就要一句一句看Makefile里install部分都改了哪些东西,然后再改回来.
如果source没了,那你就不用搞了,呵呵哒.

make产生的错误


1. cc1: error: unrecognized command line option '-fforce-mem'
   make[2]: *** [version.lo] Error 1
   make[2]: Leaving directory `/home/linux/project/source/libmad-0.15.1b'
   make[1]: *** [all-recursive] Error 1
   make[1]: Leaving directory `/home/linux/project/source/libmad-0.15.1b'
   make: *** [all] Error 2

   Makefile:2: * * *  missing separator. Stop.

   Makefile:2: * * *  missing separator. Stop.

   makefile中的tab的长度导致的,在makefile中的命令需要以tab键开始,在.vimrc文件中发现没有设置tab键的默认长度,然后在.vimrc中添加配置      set tabstop=4

关于网上一些源码编译教程的问题

  1. 如果想省事,请一定要遵循别人的教程做,教程说下哪个版本的源码,你就下哪个版本的源码,你就下哪个版本的源码,你就下哪个版本的源码.
  2. 如果按照教程搞不定,要不就是你的步骤问题,要不就是教程的问题,要不就是你的环境的问题.

移植实例

sqlite3移植

BOA移植

freetype+SDL+SDL_ttf移植及demo

编译uclibc

编译busybox

编译glibc

ffmpeg移植

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值