30
2024
10
09:13:18

编译小结(6)认识Automake

说了很多如何用gcc或 Makefile怎么编译的东东,但在Linux下装过软件的都应当见过,很多源码安装的包是用Automake

来编译的。输入下"./configure","make","make install"就装上了。Automake就是有群人觉得写Makfile不方便,特别是工程文件多

目录复杂时。所以就搞了这么个自动生成Makefile的开源的东东。类似的工具还有cmake和qmake。

     Automake功能还是很强大的,不想手写Makefile的可以试试。

     我下面有详细说明.

一. 详解Automake的编译做法,编译出一个可运行程序。

二. 如何清理Automake生成的文件和目录。

三. Automake编译中的常见问题

    测试文件:

       main.c  add.c sub.c calc.h


一. 详解Automake的编译做法,编译出一个可运行程序。

 1. autoscan

 //扫描源代码以搜寻普通的可移植性问题,

 //比如检查编译器,库,头文件等,生成文件configure.scan,它是configure.ac的一个雏形。

2. cp configure.scan configure.in

3. vi configure.in

     configure.in 文件的更改是件很麻烦的事。Automake自己定义了很多宏。而autosca生成的

    这个文件中有几个宏是必须要改的,甚至要依编译情况,还要手工加些宏在上面。

    常见的要改更的有下面几个.

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

AC_INIT(add.c,1.0)

AM_INIT_AUTOMAKE(xcldemo,1.0)

AC_CONFIG_SRCDIR([add.c])

AC_CONFIG_HEADERS([config.h]) 


# Checks for programs.

AC_PROG_CXX

AC_PROG_CC



AC_PROG_AWK

AC_PROG_INSTALL

AC_PROG_LN_S

AC_PROG_RANLIB

AC_PROG_CPP

AC_PROG_LIBTOOL


          //AC_OUTPUT表示最后要生成Makefile

          AC_OUTPUT(Makefile) 

4. aclocal

 //由configure.in生成aclocal.m4

附注: 如果执行时报错,可尝试将上面的 AC_PROG_RANLIB 注释掉


5. //编译共享库前,运行 libtoolize -f -c 但这里好像没用

    如果少了 ltmain.sh

   就执行 libtoolize --automake --copy --debug --force

     或者 libtoolize -f -c

6. autoconf

  //autoconf:将configure.ac中的宏展开,生成configure脚本。这个过程可能要用到aclocal.m4中定义的宏

  //由configure.in和aclocal.m4生成configure脚本

7. 如果没有生成config.h.in,则autoheader

  

8. vi Makefile.am

     这个文件是除了上面的configure.in以后,在Automake编译过程中要手工编写的另一个文件。

     它的作用决定了编译出来是什么样的程序,如编译出动态库还是静态库还是其它什么。

     这个文件相当蛋疼。 写法大至和手写Makefile差不多,生成定义要编译哪些文件,这些文件要引用哪些目录下的库或

     库文件。 要用到哪些编译参数等等。光这个还好说,问题是Automake还自定义了很多的宏。你要按这些宏及规则来

     写。而且你还要在这些宏前加上你要生成的库的名字。这样弄下来,个人觉得其实和单独写出个Makefile文件是一样的工作量。

AUTOMAKE_OPTIONS=foreign

bin_PROGRAMS=xcldemo

xcldemo_SOURCES=main.c add.c sub.c calc.h 


9. automake -a

    //automake --add-missing

    //由Makefile.am和configure.in生成各级目录下的Makefile.in 

附,如果出现"error: cannot find input file: Makefile.in"错误,则可以通过执行 automake --add-missing来解决.


10. 执行configure生成Makefile ,ls中应当可以看到Makefile已经产生了.

    ./configure    //执行的时候会扫描各个目录下的Makefile.in生成不同的Makefile

11. make

12.测试编译结果

[root@ol64 test4_auto]# ./xcldemo

add() = 8

sub() = 2

MAIL:xcl_168@aliyun.com

BLOG:http://blog.csdn.net/xcl168

13.打包一个tar.gz

[root@ol64 test4_auto]# make dist 

[root@ol64 test4_auto]# ls *.tar.gz

xcldemo-1.0.tar.gz 


二. 如何清理Automake生成的文件和目录。

 a. 首先理解下Automake生成的目录结构

 user input files optional input processes output files

================ ============== ========= ============

.——–,

| | – - -> COPYING

| | – - -> INSTALL

| |——> install-sh

| |——> missing

|automake|——> mkinstalldirs

configure.ac ———————–>| |

Makefile.am ———————–>| |——> Makefile.in

| |——> stamp-h.in

.—+ | – - -> config.guess

| | | – - -> config.sub

| `——+-’

| | – - – -> config.guess

|libtoolize| – - – -> config.sub

| |——–> ltmain.sh

| |——–> ltconfig

`———-’

//-------------------------------------------------------------------------


b.  理解了上面的目录结构后,就后清理了

##清掉Makfile生成的东东

make clean

##连Makefile也清掉

make distclean  

##如需要,保留输入的configure.in及Makefile.am文件

mv configure.in configure.in_old

mv Makefile.am Makefile.am_old

##清掉aclocal  

rm -rf aclocal.m4

rm -rf autom4te.cache

rm -rf autoscan.log

##清掉autoheader 

rm -rf config.h.in

##libtoolize

rm -rf ltmain.sh

##automake -a

rm -rf install-sh

rm -rf missing

rm -rf depcomp

##清掉.configure 

rm -rf config.guess

rm -rf Makefile.in

rm -rf stamp-h1

rm -rf .deps

rm -rf configure

rm -rf config.sub

rm -rf config.status

rm -rf configure.scan

--rm -rf configure.in


三.  Automake编译中的常见问题

1.如果编译出错,可以设为成中文显示错误

   解决:

locale -a #查看系统支持的语言

export.GB18030 #将系统语言改为中文


2.编译过程中提示:

/bin/rm: cannot remove `libtoolt': No such file or directory

 解决:

1、确认libtool是否已经安装,如果没有安装的话,则先安装libtool

# yum -y install libtool

2、分别执行以下三条命令:

# autoreconf --force --install

# libtoolize --automake --force

# automake --force --add-missing

再重新编译安装,问题解决!


 3. aclocal时报下面的错误

root@localhost OA]# aclocal

configure.in:6: error: m4_defn: undefined macro: _m4_divert_diversion

autoconf/general.m4:464: AC_CONFIG_SRCDIR is expanded from...

configure.in:6: the top level

autom4te: /usr/bin/m4 failed with exit status: 1

aclocal: autom4te failed with exit status: 1

 解决:

     AC_INIT和AM_INIT_AUTOMAKE一定放在AC_CONFIG的前面才可以。


4. required file `config.h.in' not found

 解决:

    在执行automake --add-missing之前执行autoheader,生成config.h.in

————————————————





推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

本文链接:https://www.hqyman.cn/post/8250.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

请先 登录 再评论,若不是会员请先 注册

您的IP地址是: