博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
autoconf 源码编译 ./configure
阅读量:4286 次
发布时间:2019-05-27

本文共 6679 字,大约阅读时间需要 22 分钟。

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

AUTOCONF和AUTOMAKE

  • AUTOCONF和AUTOMAKE是非常有用的用来发布C程序的东西.AUTOCONF产生AUTOMAKE
  • 典型的程序安装步骤要用到GNU的AUTOCONF和AUTOMAKE

编译流程

1/  阅读 README 或者 INSTALL2/  ./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-gccLDSHARED=/home/linux/gcc-4.6.4/bin/arm-none-linux-gnueabi-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.mapCPP=/home/linux/gcc-4.6.4/bin/arm-none-linux-gnueabi-gcc -EAR=/home/linux/gcc-4.6.4/bin/arm-none-linux-gnueabi-ar rcRANLIB=/home/linux/gcc-4.6.4/bin/arm-none-linux-gnueabi-ranlib/*适配编译器*/删除Makefile中的-fforce-mem,因为arm-none-linux-gnueabi-gcc不支持该参数/*针对其他平台*/大概也是这些东西,具体问题,具体分析.这些东西是需要搜索的,都是探索着一部一部做出来的注意:一定要完善路径​```
## make clean 与 make distcleanmake 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. 如果按照教程搞不定,要不就是你的步骤问题,要不就是教程的问题,要不就是你的环境的问题.

移植实例

转载地址:http://nxigi.baihongyu.com/

你可能感兴趣的文章
DVB-S info
查看>>
绿盟扫描操作指导
查看>>
理解链路本地址与站点本地地址
查看>>
/proc/mtd 各个参数含义 -- linux内核
查看>>
linux nand flash常用命令
查看>>
NESSUS扫描操作指导
查看>>
C语言读取文件大小,载入文件全部内容
查看>>
C语言 static静态变量的作用
查看>>
Linux(C/C++)下的文件操作open、fopen与freopen
查看>>
C语言 文件操作的头文件
查看>>
C语言的常用库函数(dos)之四(dir.h文件下的一些函数)
查看>>
warning: jobserver unavailable: using -j1. Add `+' to parent make rule问题怎么解决
查看>>
防火墙报文转发流程
查看>>
以太坊创始人:17岁的亿万富翁养成记
查看>>
linux下IPTABLES配置详解
查看>>
关于iptables -m选项以及规则的理解
查看>>
linux系统中查看己设置iptables规则
查看>>
一些库函数的使用注意事项
查看>>
IPv6地址自动配置中的有状态(stateful)和无状态(stateless)的区别
查看>>
阿里云 ACP 云安全 题库总结
查看>>