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跨域…

维护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)…

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

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

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

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

oracle vm中的xp添加共享文件夹

接着就可以在虚拟的电脑系统里面打开我们的共享文件夹,在桌面找到”网络邻居“,双击打开 我们需要通过”添加一个网络邻居“来加载我们刚才添加的”共享文件夹“,根据向导一步步执行 然后点击”浏览“ 展开前面的 ”“ visualBox shared fold…

MSBuild + MSILInect实现编译时AOP-改变前后对比

实现静态AOP,就需要我们在预编译时期,修改IL实现对代码逻辑的修改。Mono.Cecil就是一个很好的IL解析和注入框架,参见编译时MSIL注入--实践Mono Cecil(1)。 我的思路为:在编译时将加有继承制MethodInterceptBaseAttribute标签的原方…

惊人体积,无码改造,黑月V1.7.4增强版[20110810]

使用方法:替换 易语言 LIB目录下的黑月支持库 记得备份 去掉代码长度过少不能编译的限制.(比如空代码) 优化编译出来的文件体积大小.(exe貌似没问题,dll貌似也没问题,就是dll对体积的优化不会太多) 体积减少了N倍...不解释,不解释,高手懂得... 转载于:https://blog.51cto.com…

linux stm32 ide,一文教你如何在ubuntu上快速搭建STM32 CubeIDE环境(图文超详细+文末有附件)...

在快速ubuntu上安装cubeide你值得拥有;适合对linux系统还不是很熟悉的同学;1 下载 cubeide登陆官网,下载链接不知道是否有效,如果无效,需要提交自己的邮箱地址,ST官方会将下载链接发送至你的邮箱&#xff0…

思科(Cisco)路由器策略路由配置详解

策略路由是路由优化的常用方法。在做路由牵引时很多情况都要用到策略路由。 网络拓扑 R2的E1\E2口分别与R3的E1\E2口相连。 先配置好静态路由&#xff0c;使192.168.2.X与192.168.1.X互通(不经过R3)。即R1<->R2<->R4是互通的。 下面介绍一下配置策略路由的方法。 实…

python numpy中sum()时出现负值

import numpy anumpy.random.randint(1, 4095, (5000,5000)) a.sum() 结果为负值, 这是错误的&#xff0c;a.sum()的类型为 int32&#xff0c;如何做才能是结果显示正确呢&#xff1f;按照如下做法&#xff1a; cnumpy.int64(a).sum() 结果为正直&#xff0c;正确&#xff0c;c…

SQL Server插入中文数据出现乱码问题

问题如上图。 创建数据库的代码---创建promary表 create table promary ( proID int primary key, proName varchar(50) not null ) 出现上图所示内容是因为proName varchar(50) not null这个地方有问题。一般来说&#xff0c;如果含有中文字符&#xff0c;用nchar/nvarchar&…

c语言find和mid函数的使用方法,Excel Mid函数和MidB函数使用方法的7个实例,含与Len和Find组合反向提取字符或截取单位...

在 Excel 中&#xff0c;Mid函数用于从文本中提取从指定位置开始的指定字符数&#xff0c;而MidB函数用于从文本中提取从指定位置开始的指定字节数&#xff1b;它们的区别为&#xff1a;前者把全角(如汉字)与半角(如数字和字母)都算作一个字符&#xff0c;后者把全角算作两个字…

C++类指针类型的成员变量的浅复制与深复制

本篇文章旨在阐述C类的构造&#xff0c;拷贝构造&#xff0c;析构机制&#xff0c;以及指针成员变量指针悬空问题的解决。需要读者有较好的C基础&#xff0c;熟悉引用&#xff0c;const的相关知识。 引言&#xff1a; 类作为C语言的一种数据类型&#xff0c;是对C语言结构体的一…

21天学通c语言第四版pdf,21天学通Visual C++ PDF扫描版[116MB]

21天学通Visual C 内容简介&#xff1a;本书是Visual C语言的入门教程&#xff0c;较全面地介绍了Visual C编程的相关知识&#xff0c;然而&#xff0c;本书并没有泛讲Visual C语言的所有知识&#xff0c;而是突出重点&#xff0c;选择最重要的内容进行讲解。本书一共分为五篇&…

继续聊WPF——动态数据模板

我为啥称之为“动态数据模板”&#xff1f;先看看下面的截图&#xff0c;今天&#xff0c;我们就是要实现这种功能。 大概是这样的&#xff0c;我们定义的DataTemplate是通过触发器动态应用到 ComboBoxItem 上。 这个下拉列表控件绑定了一个Person集合&#xff0c;Person类的定…

刺激战场c语言,刺激战场:假车库、C字楼都是啥?学会吃鸡术语新手变大神!...

原标题&#xff1a;刺激战场&#xff1a;假车库、C字楼都是啥&#xff1f;学会吃鸡术语新手变大神&#xff01;刺激战场有越来越多的新玩家加入其中&#xff0c;然而新手想入门&#xff0c;却有时候找不对方法&#xff0c;其实吃鸡这个游戏其实还是非常简单的&#xff0c;不过想…

HTMLParser-实战

了解了HTMLParser库的知识后&#xff0c;选择做一个小训练&#xff0c;对https://www.python.org/events/python-events/这个网址进行分析&#xff0c;之后输出其中每次会议的题目、时间和地点。 如果要简单了解下HTMLParser库可以点击打开 下面进入正题 这是网站的源码&#x…

c++2015语言,2015年7月TIOBE编程语言排行榜:C++ 的复兴

2015年7月TIOBE编程语言排行榜&#xff1a;C 的复兴C是2015年上半年同比增长最快的编程语言。具体为C 增长3.1%&#xff0c;Java 增长2.0%&#xff0c;C#增长1.6%&#xff0c;Python增长1.6%。C大幅度增长的原因可能是引入了新的C11标准。这使得C被大范围的接受。C 11标准为C带…