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

网友投稿 283 2022-08-31

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

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'

那最好还是使用​​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的信息。

--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=foreignbin_PROGRAMS=mainmain_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.oadd.c autoscan.log config.h.in~ configure install-sh main makefile missing stamp-h1add.o config.h config.log configure.in int_div.c main.c makefile.am multi.c sub.c

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

$ wc -l makefile613

可以查看: ​​./mainadd: 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.oadd.o:add.c gcc -o add.o -c add.csub.o:sub.c gcc -o sub.o -c sub.cmulti.o:multi.c gcc -o multi.o -c multi.cint_div.o:int_div.c gcc -o int_div.o -c int_div.cmain.o:main.c gcc -o main.o -c main.cclean: rm -f *.o

执行:

$ ./mymainadd: 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​​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:公关界的007:重庆百货、肯德基...9个数字化服务品牌,攒了个“爆”局!
下一篇:algorithm 题集六 (16.11.12)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~