您的位置:首页 > 其它

makefile学习 (2) —— autotools生成makefile

2016-10-30 19:43 239 查看

autotools生成makefile

利用autotools系列工具可以快速生成makefile,我们输入目标文件,依赖文件,文件目录等信息即可。

我们需要保证有这些工具:aclocal, autoscan, autoconf, autoconf, autoheader, automake.

在安装的时候仅仅需要指令
yum install automake
sudo apt-get install automake
即可

还是以四则运算的例子来说明这套工具的使用

在当前目录中,我们有文件:

add.c sub.c multi.c int_div.c main.c


借百度百科的makefile相册一用,这是autotools工具的使用流程:



1. autoscan

autoscan # 检查源文件


这将产生新文件:autoscan.log configure.scan

2. 修改文件configure.scan

主要修改部分是

#AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_INIT(main,1.0)
AC_INIT_AUTOMAKE(main,1.0)

AC_CONFIG_SRCDIR([main.c])
#AC_CONFIG_HEADERS([config.h])
AM_CONFIG_HEADERS([config.h])


AC_INIT(main,1.0)
设置软件名称和版本

AC_CONFIG_HEADERS([config.h])
修改成
AM_CONFIG_HEADERS([config.h])
,主要因为后者比前者有更好的兼容性来生成makefile,打开共享库

如果有这样的提示:

warning: macro `AM_CONFIG_HEADERS' not found in library


那最好还是使用
AC_CONFIG_HEADERS([config.h])


然后将configure.scan改名成为configure.in

mv configure.scan configure.in


3. aclocal

aclocal #生成aclocal.m4文件 or autom4te.cache


4. autoheader

autoheader #生成config.in文件


5. 建立makefile.am文件

这里有几个参数需要说明:

AUTOMAKE_OPTIONS是automake的选项,下面是man的信息。

Flavors:
--cygnus
assume program is part of Cygnus-style tree

--foreign
set strictness to foreign

--gnits
set strictness to gnits

--gnu  set strictness to gnu


foreign,automake会改用一般软件套件标准来检查;gnu是缺省设置,该级别下将尽可能地检查包是否服从GNU标准;gnits是严格标准。

bin_PROGRAMS定义要产生的执行文件名称。产生多个执行文件的话,用空格符隔开。

test_SOURCES定义需要的源文件。

在makefile.am中添加这样的内容:

AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=main
main_SOURCES=add.c sub.c multi.c int_div.c main.c


6. autoreconf

autoreconf -fmi  #生成configure  makefile.in  missing等文件


因为单独使用automake经常出现
no proper invocation of AM_INIT_AUTOMAKE was found.
的错误,所以这里使用
autoreconf -fmi


$  man autoreconf
...

-f, --force
consider all files obsolete

-i, --install
copy missing auxiliary files

--no-recursive
don’t rebuild sub-packages

-s, --symlink
with -i, install symbolic links instead of copies

-m, --make
when applicable, re-run ./configure && make

...


7. 生成makefile

./configure  #生成makefile


8. make编译

make  #编译、生成可执行文件


在这些都完成后,我们产生的文件有:

aclocal.m4  autom4te.cache  config.h.in   config.status  depcomp     int_div.o  main.o       makefile.in  multi.o   sub.o
add.c       autoscan.log    config.h.in~  configure      install-sh  main       makefile     missing      stamp-h1
add.o       config.h        config.log    configure.in   int_div.c   main.c     makefile.am  multi.c      sub.c


而且,对应的makefile好复杂,统计了一下行数

$ wc -l makefile
613 makefile


可以查看: http://note.youdao.com/noteshare?id=6abda37b23434cf6410500cc5b544547

它的执行结果:

$ ./main
add: 12 sub: -4 multi: 32   div: 0.500000


我们自己写的话,myfile的行数只有15行:

mymain: add.o sub.o multi.o int_div.o main.o
gcc -o mymain add.o sub.o multi.o int_div.o main.o
add.o:add.c
gcc -o add.o -c add.c
sub.o:sub.c
gcc -o sub.o -c sub.c
multi.o:multi.c
gcc -o multi.o -c multi.c
int_div.o:int_div.c
gcc -o int_div.o -c int_div.c
main.o:main.c
gcc -o main.o -c main.c
clean:
rm -f *.o


执行:

$ ./mymain
add: 12 sub: -4 multi: 32   div: 0.500000


使用autotools是方便生成makefile,我们不用自己写。但是后期改动的话就不一定轻松了。

软件打包

利用autotools生成的makefile,我们可使用make dist进行程序的打包。

make dist


这将生成
main-1.0.tar.gz
,压缩包的名称由configure.scan / configure.in中的

AC_INIT(main,1.0)
AC_INIT_AUTOMAKE(main,1.0)


决定的。

我们可以使用这个压缩包到一个新的环境中生成可执行文件

1. 解压

tar -zxvf main-1.0.tar.gz


2. 生成makefile

./configure


3. make编译生成可执行文件

make


如果可以,还能继续下面的步骤:

4. 软件安装

make install


5. 清除可执行文件与目标文件

make clean
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: