linux新建好文件后怎么编译,使用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

如下图所示:

1db60e3e147252f76a7d284907cf2662.png

进入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

a00518d6fb63c0e12f0cc8436100fb50.png

编辑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或者开源论坛了。

40613449d5589ac16f01ff31d3722c31.png

别人下载了我们的源码包之后怎么编译链接可执行文件呢?或者说我们怎么编译链接我们的可执行文件呢?

以下是源码安装的一般步骤,也是我们编译链接的步骤

首先生成Makefile

./configure

然后make

make

现在我们可以看见,可执行文件 test_prj 已经被生成出来了

68d13fbd24f0a0e91bee3230c92d64aa.png

运行一下,结果如下:

b4db4f666acf606fff39fd30779f9a0e.png

结果是正确的。

进入src目录下,我们发现多了两个文件

c9f2b2d7c252c0710d67d87da5e0dcae.png

这就是AUTOMAKE_OPTIONS里subdir-objects的作用,少了这句话,这两个.o文件就会出现在你的根目录下。如果很不幸你的工程比较大,有同名文件的话,那就可能出现很严重的后果了,所以这句话建议加上。

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267698.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端跨域的那些事

这一节,我们来讲一讲,前端跨域的那些事,主要分成这样的几部分来讲解, 一、为什么要跨域? 二、常见的几种跨域与使用场景 2.1 JSONP跨域 2.2 iframe跨域 2.3 window.name 跨域 2.4 document.domain 跨域 2.5 cookie跨域…

VC++学习(15):多线程

1. 程序,进程,线程 A: 程序是计算机指令的集合,它以文件的形式存储在磁盘上,而进程通常被定义为一个正在运行的程序的实例,是一个程序在其自身的地址空间中的一次执行活动.一个程序可以对应多个进程. 进程是资源申请,高度和独立运行的单位,因此,它使用系统中的运行资源,而…

在linux中500g怎么分区,500G的硬盘,怎么分区比较合理?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼个人电脑怎么分?希望大家给我规范一下另外,我的/dev/sda2用的是xfs,/dev/sda9用的是reiser4draplaterDrapl ~ $ sudo fdisk -l密码:Disk /dev/sda: 160.0 GB, 160041885696 bytes255 …

CSS宽高背景介绍

本萌新还未毕业,在一家外包公司干了一个月,因烦恼日常琐事任务,深感外包之坑,以及上班路途艰辛,特转战erp实施,继写日常随笔,望来日屌丝逆袭,走上人生巅峰。 若有错误,请…

linux交叉编译生成的是什么,静态链接util-linux – 交叉编译(生成动态链接文件)...

我一直试图交叉编译util-linux for arm但我一直以动态链接的可执行文件结束,我不知道为什么会这样.我的目标是静态的.我在使用类似步骤的不同工具之前进行了交叉编译,并且它一直有效,所以这次我不知道我做错了什么.我正在使用Ubuntu 16.04.以下是我正在运行的命令:e…

维护SAP帮助信息(WEB)

维护SAP帮助信息(WEB) 1、首先进入000 Client ,然后scc4修改000的模式 2、spro 3、 4、 5、注意 服务器为:http://help.sap.com 路径为:saphelp_erp60_sp/helpdata 转载于:https://blog.51cto.com/anhwei/626111

读jQuery之十二(删除事件核心方法)

使用jQuery删除事件(或称解除事件绑定)有三个函数:unbind、die和undelegate。这三个方法都依赖于未公开的jQuery.event.remove(后续使用remove简写)。此为删除事件的核心方法。remove 所作的事情与上一篇提到的.add 刚…

像Excel一样使用python进行数据分析(1)

(虽然是转载,但是是我每块都测试过得,容易出问题的地方我会添加一些自己的经验,仅供参考) 像Excel一样使用python进行数据分析(2) 像Excel一样使用python进行数据分析(3)…

linux svn 自动部署,linux下svn安装和自动部署

liunx系统下安装svn并自动更新到项目中三部分:【1.安装 2.建立svn库 3.配置文件】html查看是否安装了svn 【svn –version】若是安装了svn能够先进行卸载 【sudo apt-get remove –purge subversion】接下来进行安装 【sudo apt-get install subversion】当安装成功…

css优先级

很经典的文章啊 [转]CSS的优先级特性Specificity 如果同个元素有两个或以上冲突的CSS规则,浏览器有一些基本的规则来决定哪一个非常特殊而胜出。它可能不像其它那么重要,大部分案例你不需要担心冲突,但大型而且复杂的CSS文件,或有…

linux编译准备,Linux 下编译指南

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼首先,我们需要获取最新的源码。使用如下命令即可:git clone -b master --depth1 https://github.com/CleverRaven/Cataclysm-DDA.git这条命令会只获取 master 分支下最新的代码。对于普通玩家来说这已经足够…

ServletConfig的详解

一、Servlet的作用 servlet是在servlet容器内运行的程序,有时需要访问容器外部或借助容器访问外部资源。所以可以通过web.xml文件中为某个servlet配置的名称和参数等信息传递给servlet。 这样做的好处是:如果将重要的信息、编码方式等配置信息放在web.xm…

You can't specify target table 'tablename' for update in FROM clause的解决方法

在执行下面的sql时报错 DELETE FROM temp WHERE id IN (SELECT a.id FROM t_user t JOIN temp a ON t.email a.email); 这种写法在sqlserver或者oracle中是支持的,但是mysql目前是不支持的,在mysql中不能同时查询一个表的数据再同时进行删除&#xff0…

linux缓存代码,Linux使用的缓存

Linux使用的缓存6.7.1 Linux使用的缓存不管在硬件设计还是软件设计中,高速缓存是获得高性能的常用手段。Linux 使用了多种和内存管理相关的高速缓存。1. 缓冲区高速缓存:缓冲区高速缓存中包含了由块设备使用的数据缓冲区。这些缓冲区中包含了…

Linux查看文件夹大小du

du命令参数详解见: http://baike.baidu.com/view/43913.htm 下面我们只对其做简单介绍; 查看linux文件目录的大小和文件夹包含的文件数 统计总数大小 du -sh filename(其实我们经常用du -sh *,显示当前目录下所有的文件及其大小&a…

cursor: mutex S等待事件

cursor: mutex * events等待事件 cursor: mutex * events等待事件用于Cursor Parent 和 Cursor stats类型的操作: ‘Cursor: Mutex S’ , 某个进程以SHRD S mode申请一个Mutex, 而该Mutex要么被其他进程已EXCL X mode所持有,要么其…

flash和linux文件系统,面向大容量Flash的高效Linux文件系统改进和实现

摘要:文件系统是Linux操作系统的重要组成部分.而本文对于面向大容量Flash文件系统高效性的研究则主要侧重于对于嵌入式Linux操作系统文件系统的研究.由于嵌入式设备介质的特殊性,电源系统的不稳定性以及Flash容量的日益增长,大容量Flash设备文件系统高效性方面的问题…

Xshell配置ssh免密码登录-密钥公钥(Public key)

1 简介 ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式。其中口令(密码)认证方式是我们最常用的一种,这里介绍密钥认证方式登录到linux/unix的方法。 使用密钥登录分为3步: 1、生成密钥(公钥与私钥)&#…

Linux面试题集锦,测测你的水平(答案)四

三.简答题:1.简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程。参考答案:Linux通过i节点表将文件的逻辑结构和物理结构进行转换。i节点是一个64字节长的表,表中包含了文件的相关信息,…

linux vim ctags,Linux环境上代码阅读与编写的利器-vim+ctags+cscope

Linux环境下代码阅读与编写的利器----vimctagscscope所谓工欲善其事,必先利其器。从事Linux程序开发,特别是Linux驱动程序的开发,不管是通过windows下虚拟一个Linux,还是通过samba访问Linux都是很郁闷的事情。原因就是程序本身需要Linux的编译…