前言

在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

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新建好文件后怎么编译,使用autoconf生成Makefile并编译工程的步骤相关推荐

  1. Linux 新建log文件

    Linux 新建log文件 家目录下创建log文件(新文件) 在uwsgi.ini文件中添加 root : 家目录,新文件创建在那个目录下就写那个目录 logto = /root/uwsgi_log. ...

  2. linux新建脚本文件,linux shell脚本编程2—修改文件时间和创建新文件即touch命令的使用...

     在使用ls命令时,每个文件在Linux下面都会记录3个主要的修改时间: modification time(mtime,修改时间):当该文件的"内容数据"更改时,就会更新这个时 ...

  3. linux无法保存文件,Linux系统创建文件后无法保存

    生产环境: 操作系统:CentOS [[email protected] html]# vi test_conn_use_db.php "test_conn_use_db.php" ...

  4. Linux删除大文件后磁盘空间未释放问题

    前言 工作中经常遇到Linux系统磁盘空间不足,但是删除后较大的日志文件后,发现磁盘空间仍没有被释放,有点摸不着头脑,今天博主带大家解决这个问题. 思路 1.工作发现磁盘空间不足: 2.找到占用磁盘空 ...

  5. linux拷贝带子文件夹命令,简单带子目录的makefile练习

    开始学linux.我练习写的第一个带子目录的makefile文件. 1.建立文件夹 wulong wulong中含 三个文件夹 include source pro 和makefile文件. incl ...

  6. 在Manjaro中Debtap将deb文件转换成pkg文件后,怎么解压生成的.pkg.tar.xz包?

    接上篇博客,本篇博客解决的问题如下: 在Manjaro中Debtap将deb文件转换成pkg文件后,怎么处理生成的.pkg.tar.xz压缩包? 解决办法如下: 以我的mnetassist-0.1.1 ...

  7. linux新建用户切换后显示-bash-4.1$(转载)

    今天新建了一个MQM的用户 , [plain] view plaincopy useradd -g mqm -d /var/mqm passwd mqm 终端中显示 -bash-4.1$而不是 [mq ...

  8. Linux——新建txt文件并编辑

    touch + abc.txt(文件名 ) 创建文件abc.txt文件 ls 查看所有文件 vi abc.txt vi为进入vim编辑器命令,意为在vim编辑器中编辑abc.txt文件 输入a后,可以 ...

  9. linux 新建中文文件夹,linux中文文件夹如何改回英文

    匿名用户 1级 2018-05-31 回答 其实我已经忍了很久. ubuntu在中文界面下面,自动创建了"桌面","文档",图片 .公共的 .下载. 音乐. 视 ...

最新文章

  1. 001-ant design安装及快速入门【基于纯antd的基本项目搭建】
  2. 云数据管理公“云信达”获东方富海数千万A轮投资
  3. iis7 php安装教程,iis7 php安装方法详解
  4. CDS view delivered in CRM EHP4
  5. 【转】使用Apache Kylin搭建企业级开源大数据分析平台
  6. php 映射程序,windows磁盘映射技术分享
  7. HDU - 1757 A Simple Math Problem (矩阵快速幂)
  8. IntelliJ IDEA中使用git
  9. 情感分析︱网络公开的免费文本语料训练数据集汇总
  10. 升级Linux(Ubtun/CentOS)的OpenSSL(openssl-1.0.1h.tar.gz)
  11. CSS 3之美化表格样式
  12. 用python算股票月涨幅_「」股票产品 python-如何选取过去每个月股票的市值 python-TOP金融网...
  13. esp32 camera_ESP32操作L298N以及示例程序说明
  14. 网口压线顺序_水晶头压线顺序
  15. 产品经理天马行空,表格组件应对自如
  16. 一个案例教会你:全面的数据分析应该怎么做?
  17. 什么是BI、什么是ETL?一篇文章告诉你
  18. 微信支付、公众号支付、微信APP支付教程
  19. STM32F1_HAL库用户使用手册UM1850
  20. Ubuntu 网络应用服务器 Apache 配置基础

热门文章

  1. Linux内核分析(三)----初识linux内存管理子系统
  2. 谈谈即时通讯开发平台
  3. 各类防火墙应用对比分析
  4. ie 7 beta 2出来了
  5. 使用OutputDebugString帮助调试
  6. 人工智能与图像传感器
  7. interface-C#接口-统一的标准
  8. com 组件调用不起来_AwesomeGithub组件化探索之旅
  9. 求1到100中9的个数
  10. qt qthead里如何响应信号_Qt 中的多线程技术(翻译)