使用autoconf生成Makefile并编译工程

来源:互联网 发布:北森职业测评软件 编辑:程序博客网 时间:2024/05/16 05:58

前言

在Linux下,编译和链接需要用Makefile,而写好一个Makefile可不容易,写出一个规范的Makefile更是麻烦。我们可以利用autoconf来生成一个Makefile,尤其在大型工程里,能省去很多麻烦。
这里我会用一个工程来说明怎么做,有一些步骤不是必须的,但是如果你看不出来哪些步骤不是必须的,最好跟着一步步走,因为某些步骤省略了,代码也需要做出相应修改(如修改路径等)。

步骤

  • 首先安装autoconf
    sudo apt-get install autoconf
  • 新建一个项目文件夹(例如:joy)
    mkdir joy
    cd joy
  • 在里面新建两个文件夹 lib 和 src ,用于放工程的库文件和源文件。
    mkdir lib
    mkdir src
    如下图所示:
    这里写图片描述

  • 进入lib文件夹,新建一个头文件,如:haha.h,随便声明个函数吧。
    cd lib
    gedit haha.h

//haha.h#include <stdio.h>void printhaha();
  • 进入src文件夹,新建一个C文件,如:haha.c,实现头文件的函数;新建一个C文件,如:main_code.c,编写主函数。
    cd ../src
    gedit haha.c
//haha.c#include "../lib/haha.h"void printhaha(){    printf("haha\n");}
//main_code.c#include "../lib/haha.h"void main(){    printhaha();}
  • 回到joy文件夹下,我们的工程文件都已经写好了
    cd ..
  • 运行autoscan生成configure.scan
    autoscan
    这里写图片描述

  • 编辑configure.scan
    gedit configure.scan
    编辑之前的文件是这样的

#编辑之前的原始文件#                                               -*- Autoconf -*-# Process this file with autoconf to produce a configure script.AC_PREREQ([2.69])AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])AC_CONFIG_SRCDIR([src/haha.c])AC_CONFIG_HEADERS([config.h])# Checks for programs.AC_PROG_CC# Checks for libraries.# Checks for header files.# Checks for typedefs, structures, and compiler characteristics.# Checks for library functions.AC_OUTPUT

前缀AC指的是 AutoConf
AC_PREREQ不用管
AC_INIT里面填【包名】【版本】【BUG提交地址 也就是你的邮箱】
AC_CONFIG_SRCDIR里填源文件路径下的任意一个文件名,autoconf通过检测这个文件是否存在,判断这个路径是否正确,一般不用管
AC_CONFIG_HEADERS不用管
插入下面这句,automake阶段需要,否则会报错
AM_INIT_AUTOMAKE
前缀AM指的是 AutoMake
最后的AC_OUTPUT,改为AC_OUTPUT(Makefile)
修改完之后的文件如下所示:

#修改后的文件#                                               -*- Autoconf -*-# Process this file with autoconf to produce a configure script.AC_PREREQ([2.69])AC_INIT(hhh, 1.0, idontknow@666.com)AC_CONFIG_SRCDIR([src/haha.c])AC_CONFIG_HEADERS([config.h])AM_INIT_AUTOMAKE   # Checks for programs.AC_PROG_CC# Checks for libraries.# Checks for header files.# Checks for typedefs, structures, and compiler characteristics.# Checks for library functions.AC_OUTPUT(Makefile)
  • 保存,并将configure.scan重命名为configure.ac
  • 新建Makefile.am
    gedit Makefile.am
    输入以下代码
AUTOMAKE_OPTIONS= \    foreign \    subdir-objectsbin_PROGRAMS=test_prj  test_prj_SOURCES= \    lib/haha.h \    src/haha.c \    src/main_code.c

AUTOMAKE_OPTIONS后面是automake的执行选项,用空格隔开;
foreign指的是只检测必须的文件;
subdir-objects指的是编译生成的.o文件可以放在子路径(跟源文件放一起),没有这个选项的话,所有.o文件都会放在工程根目录下;
bin_PROGRAMS 后面的名字是 生成的可执行二进制文件名
可以有多个 bin_PROGRAMS ,但每个 bin_PROGRAMS 都需要有相对应的 xxx_SOURCES ;
xxx_SOURCES 是 可执行文件xxx的依赖项,包括头文件,源文件等

  • 用aclocal生成aclocal.m4文件
    aclocal
  • 用autoconf生成configure文件
    autoconf
  • 用autoheader生成config.h.in
    autoheader
  • 用automake生成Makefile.in,需要加上 –add-missing使其自动加上缺省文件
    automake --add-missing
  • 然后我们这个软件就做好了,可以整个包拿去上传github或者开源论坛了。
    这里写图片描述
  • 别人下载了我们的源码包之后怎么编译链接可执行文件呢?或者说我们怎么编译链接我们的可执行文件呢?
  • 以下是源码安装的一般步骤,也是我们编译链接的步骤
  • 首先生成Makefile
    ./configure
  • 然后make
    make
  • 现在我们可以看见,可执行文件 test_prj 已经被生成出来了
    这里写图片描述

  • 运行一下,结果如下:
    这里写图片描述

  • 结果是正确的。

  • 进入src目录下,我们发现多了两个文件
    这里写图片描述
    这就是AUTOMAKE_OPTIONS里subdir-objects的作用,少了这句话,这两个.o文件就会出现在你的根目录下。如果很不幸你的工程比较大,有同名文件的话,那就可能出现很严重的后果了,所以这句话建议加上。
0 0
原创粉丝点击