autoconf 源码编译 ./configure

版权声明:本文为博主原创文章,任何组织或者个人可以在任何媒介上发表或转载我的文章、图片等.且转载后必须注明出处和邮箱,博客地址(https://blog.csdn.net/u011011827),本人邮箱([email protected]) https://blog.csdn.net/u011011827/article/details/79813816
本篇主要讲已经存在一个autoconf 管理的源码,怎么将其编译成功

AUTOCONF和AUTOMAKE

  • AUTOCONF和AUTOMAKE是非常有用的用来发布C程序的东西.AUTOCONF产生AUTOMAKE
  • 典型的程序安装步骤要用到GNU的AUTOCONF和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选项来指定执行代码编译工作的主机,通常该值默认是cofig.guess(该shell脚本和./configure在同一目录)来猜即可(一般就是你执行编译操作的主机),当然你也可以通过这个选项指定具体的值。
    --build=BUILD     configure for building on BUILD [guessed]
//编译的程序在什么机器上运行是由--host选项指定的,其默认值都是--build,当两者不一样的时候就是所谓的交叉编译。--host=arm-linux arm平台  --host=arm-none-linux-gnueabi 什么?
    --host=HOST       cross-compile to build programs to run on HOST [BUILD]
//--target选项用来配置编译工具,它只有在建立交叉编译环境的时候用到,正常编译和交叉编译都不会用到。他用--build主机上的编译器,编译一个新的编译器(binutils, gcc,gdb等),这个新的编译器将来编译出来的其他程序将运行在target指定的系统上。如果没有指定,默认将使用’–host’选项的值.
    --target=TARGET   configure for building compilers for 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 会报错

else

但是往往不是一番风顺,可能会遇到各种各样的问题.
1/
  可能需要的依赖包没安装
2/
  可能编译器版本和源码不适配
3/
  makefile 的tab 问题
4/
  源码需要修改
- 这个步骤在某些源码移植中是不用的,因为我们可以用./configure 加一些选项生成可以被make直接解析的Makefile,但有时候我们修改Makefile是为了修改编译器并适配编译器的选项,因为部分configure没有适配编译器
- 某些make 编译的时候需要设置环境变量,我还没有遇到过这种情况
- 如果修改的话

​```c
/*针对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不支持该参数
/*针对其他平台*/
大概也是这些东西,具体问题,具体分析.
这些东西是需要搜索的,都是探索着一部一部做出来的
注意:一定要完善路径
​```
## make clean 与 make distclean

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

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

---

## 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移植

猜你喜欢

转载自blog.csdn.net/u011011827/article/details/79813816