使用autoconf生成Makefile并编译工程的步骤

 更新时间:2019年02月26日 09:07:25   作者:Joyce_Ng  
今天小编就为大家分享一篇关于使用autoconf生成Makefile并编译工程的步骤,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

前言

在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-objects
bin_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文件就会出现在你的根目录下。如果很不幸你的工程比较大,有同名文件的话,那就可能出现很严重的后果了,所以这句话建议加上。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • Linux 文件压缩和打包简介

    Linux 文件压缩和打包简介

    Linux 上常用的压缩/解压工具,介绍了zip、rar、tar的使用。今天我们来详细探讨下
    2018-10-10
  • 详解Linux误删用户家目录的恢复方法

    详解Linux误删用户家目录的恢复方法

    本篇文章主要介绍了详解Linux误删用户家目录的恢复方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • centOS7 下利用iptables配置IP地址白名单的方法

    centOS7 下利用iptables配置IP地址白名单的方法

    下面小编就为大家带来一篇centOS7 下利用iptables配置IP地址白名单的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • 在windows上如何将本地文件上传至Linux服务器

    在windows上如何将本地文件上传至Linux服务器

    这篇文章主要介绍了在windows上如何将本地文件上传至Linux服务器问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 红帽RHEL8和7的区别对比分享(Centos8与7参照redhat)

    红帽RHEL8和7的区别对比分享(Centos8与7参照redhat)

    这篇文章主要介绍了红帽RHEL8和7有什么区别(Centos8与7参照redhat),包括红帽RHEL8和RHEL7功能区别对比和RHEL8额外新功能新特性,对红帽RHEL8和7相关知识感兴趣的朋友跟随小编一起看看吧
    2023-01-01
  • 用DNSPod和Squid打造自己的CDN(二)

    用DNSPod和Squid打造自己的CDN(二)

    智能DNS可以说是CDN的基础。相信平时大家做网站都会有下面的情况:首页上放两个链接,电信用户请访问主力站点A,网通用户请访问镜像站点B
    2013-04-04
  • 详解Ubuntu/CentOS下Apache多站点配置

    详解Ubuntu/CentOS下Apache多站点配置

    本篇文章主要介绍了Ubuntu/CentOS下Apache多站点配置,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Linux通过匿名管道进行进程间通信

    Linux通过匿名管道进行进程间通信

    这篇文章主要介绍了Linux通过匿名管道进行进程间通信,介绍了什么是管道,popen函数,pipe调用等相关内容,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Centos安装php高版本

    Centos安装php高版本

    PHP(超文本预处理器)是一种通用开源脚本语言。主要适用于Web开发领域。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多,使代码运行更快。
    2016-05-05
  • linux下安装Hadoop的详细教程

    linux下安装Hadoop的详细教程

    这篇文章主要介绍了linux下安装Hadoop的详细教程,Hadoop是一个分布式系统基础架构,充分利用集群的威力进行高速运算和存储,需要的朋友可以参考下
    2023-03-03

最新评论