automake/autoconf的简单例子
参考文章1:http://loftor.com/archives/automake.html
参考文章2:http://www.blogjava.net/huyi2006/articles/187908.html
项目一 helloworld
整个基础上仅有一个helloworld.c文件,功能也非常简单,只是向屏蔽输出一句hello。
新建一个helloworld目录,然后在里面新建一个文件helloworld.c,内容为:
#include <stdio.h> int main(int argc, char **agrv)
{
printf("Hello, Merlin\n"); return ;
}
执行命令autoscan生成一个架构configure.scan,将其重新命名为configure.ac(新版本使用ac后缀名,不再使用in后缀),此时目录中含有以下文件
merlin@tfAnalysis:~/t/hellworld$ ls
autoscan.log configure.ac helloworld.c
原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([helloworld.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
将其修改为以下样子:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script. AC_PREREQ([2.69])
AC_INIT(helloworld, 0.1, tfa2012@foxmail.com)
AC_CONFIG_SRCDIR(helloworld.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)
AC_CONFIG_SRCDIR(helloworld.c)的功能是在./configure时检测文件helloworld.c是否存在,从而检测源码的正确性。
依次执行aclocal和autoconf两人个命令,此时文件夹中内容为:
merlin@tfAnalysis:~/t/hellworld$ ls
aclocal.m4 autom4te.cache autoscan.log configure configure.ac helloworld.c
新建文件Makefile.am文件,并填写入以下内容:
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = helloworld
helloworld_SOURCES = helloworld.c
执行automake --add-missing
merlin@tfAnalysis:~/t/hellworld$ automake --add-missing
configure.ac:: installing './compile'
configure.ac:: installing './install-sh'
configure.ac:: installing './missing'
Makefile.am: installing './depcomp'
此时文件夹中内容为:
merlin@tfAnalysis:~/t/hellworld$ ls
aclocal.m4 compile depcomp Makefile.am
autom4te.cache configure helloworld.c Makefile.in
autoscan.log configure.ac install-sh missing
这个时候就可以使用./configure来生成Makefile文件了
merlin@tfAnalysis:~/t/hellworld$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking whether gcc understands -c and -o together... yes
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: executing depfiles commands
编译出来试试:
merlin@tfAnalysis:~/t/hellworld$ make
gcc -DPACKAGE_NAME=\"helloworld\" -DPACKAGE_TARNAME=\"helloworld\" -DPACKAGE_VERSION=\"0.1\" -DPACKAGE_STRING=\"helloworld\ 0.1\" -DPACKAGE_BUGREPORT=\"tfa2012@foxmail.com\" -DPACKAGE_URL=\"\" -DPACKAGE=\"helloworld\" -DVERSION=\"0.1\" -I. -g -O2 -MT helloworld.o -MD -MP -MF .deps/helloworld.Tpo -c -o helloworld.o helloworld.c
mv -f .deps/helloworld.Tpo .deps/helloworld.Po
gcc -g -O2 -o helloworld helloworld.o
merlin@tfAnalysis:~/t/hellworld$ ls
aclocal.m4 config.log depcomp install-sh missing
autom4te.cache config.status helloworld Makefile
autoscan.log configure helloworld.c Makefile.am
compile configure.ac helloworld.o Makefile.in
merlin@tfAnalysis:~/t/hellworld$ ./helloworld
Hello, Merlin
项目二 tfadc
这个工程稍微复杂一些,具体的结构是这样子的:
tfadc/
scripts/
src/
cmdline.c
confile.c
main.c
network.c
db/
include/
tfadp/
tfadp.c
tfana/
tfana.c
在tfadc目录下面运行autoscan命令,此时获得的configure.scan需要修改成configure.ac,是以下样子:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script. AC_PREREQ([2.69])
AC_INIT([tfadc], [0.2], [tfa2012@foxmail.com])
AC_CONFIG_SRCDIR([config.h.in])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE # Checks for programs.
AC_PROG_CC # Checks for libraries. # Checks for header files.
AC_CHECK_HEADERS([netinet/in.h stdlib.h string.h]) # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions.
AC_CHECK_FUNCS([bzero socket strerror]) #AC_CONFIG_FILES([Makefile])
AC_OUTPUT(
Makefile
src/Makefile
)
在tfadc目录下面新建一个Makefile.am,这里指示还有子目录为src,表明子目录中有Makefile.am文件:
AUTOMAKE_OPTIONS = foreign SUBDIRS = src
#EXTRA_DIST = doc/userguide
新建另外一个文件src/Makefile.am,这里没有指示其还有子目录的Makefile.am,而是让如tfadp下的源码使用tfadp/tfadp.c这样的形式引入到本Makefile.am中来,这个时候需要在AUTOMAKE_OPTIONS中加入subdir-objects参数:
AUTOMAKE_OPTIONS = foreign subdir-objects bin_PROGRAMS = tfadc
tfadc_SOURCES = cmdline.c confile.c main.c network.c tfadp/tfadp.c tfana/tfana.c
#tfadc_LDADD = db/db.a tfana/tfana.a
如果想要把tfana中的文件编译成库文件的话,则需要在tfana中新建一个Makefile.am,那么上面的src/Makefile.am就需要添加一个SUBDIRS = tfana了,并且还需要修改src/Makefile.am加上tfadc_LDADD = tfana/tfana.a这一行。具体如何操作还需要看一看网上的例程(参数链接2)。
添加完两个Makefile.am之后就可以使用automake --add-missing生成configure文件了,后面的步骤就简单了./configure && make...
本文将持续完善,将在未来的实际项目时添加以下内容
1 配置安装路径等选项
2 添加配置选项(./configure --enable-xxx)
3 如果软件有配置文件则如何拷贝到实际环境中
4 静态库生成与动态库生成方法
automake/autoconf的简单例子的更多相关文章
- 大型项目使用Automake/Autoconf完成编译配置
http://www.cnblogs.com/xf-linux-arm-java-android/p/3590770.htmlhttp://blog.csdn.net/zengraoli/articl ...
- Hibernate4.2.4入门(一)——环境搭建和简单例子
一.前言 发下牢骚,这段时间要做项目,又要学框架,搞得都没时间写笔记,但是觉得这知识学过还是要记录下.进入主题了 1.1.Hibernate简介 什么是Hibernate?Hibernate有什么用? ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答
一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...
- spring mvc(注解)上传文件的简单例子
spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...
- ko 简单例子
Knockout是在下面三个核心功能是建立起来的: 监控属性(Observables)和依赖跟踪(Dependency tracking) 声明式绑定(Declarative bindings) 模板 ...
- mysql定时任务简单例子
mysql定时任务简单例子 ? 1 2 3 4 5 6 7 8 9 如果要每30秒执行以下语句: [sql] update userinfo set endtime = now() WHE ...
- java socket编程开发简单例子 与 nio非阻塞通道
基本socket编程 1.以下只是简单例子,没有用多线程处理,只能一发一收(由于scan.nextLine()线程会进入等待状态),使用时可以根据具体项目功能进行优化处理 2.以下代码使用了1.8新特 ...
- 一个简单例子:贫血模型or领域模型
转:一个简单例子:贫血模型or领域模型 贫血模型 我们首先用贫血模型来实现.所谓贫血模型就是模型对象之间存在完整的关联(可能存在多余的关联),但是对象除了get和set方外外几乎就没有其它的方法,整个 ...
- [转] 3个学习Socket编程的简单例子:TCP Server/Client, Select
以前都是采用ACE的编写网络应用,最近由于工作需要,需要直接只用socket接口编写CS的代码,重新学习这方面的知识,给出自己所用到的3个简单例子,都是拷贝别人的程序.如果你能完全理解这3个例子,估计 ...
随机推荐
- Scala 专题指南
Scala 专题教程-Case Class和模式匹配 Scala 专题教程-Case Class和模式匹配(1):简单的演示样例 Scala 专题教程-Case Class和模式匹配(2): 模式的种 ...
- Team Foundation Server 2015使用教程--默认团队权限说明
- LeetCode 48 Anagrams
Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be ...
- 解决TD于ie10没有问题,
.打开命令提示符下,输入 gpedit 回车打开组策略编辑器: .计算机配置-管理模版-全部设置-关闭数据运行保护,双击打开.选择已启用.关闭组策略浏览器. .命令提示符下输入gpupdate/for ...
- The JSON request was too large to be deserialized
The JSON request was too large to be deserialized 这个问题出现的场景并不是很多,当你向服务端异步(ajax)post数据非常大的情况下(比如做权限管理 ...
- 酒旗少年狂暖风,至0基本的前端开发project教师们学习计划
酒旗风暖少年狂,为0基础前端开发project师做学习计划 夜幕降暂时.走到一张废弃已久的书桌前,打开台灯,看到书桌上已经布满灰尘,而桌上的那盆羸弱的文竹已经枝繁叶茂.我擦干净了桌面,坐了下来,把买回 ...
- Flux是一个Facebook团队的前端开发架构
Flux是一个Facebook团队的前端开发架构 Flux introduction 本文组成: React 官方文档翻译 相关实践心得. 内容上是Flux的介绍,例子将会在以后写出.一旦稍微多了解一 ...
- JavaEE(8) - 本地和远程调用的有状态以及无状态Session EJB
1. 使用NetBeans开发Session Bean #1. 创建项目:File-->New Project-->Java EE-->EJB Module #2. 在项目中创建Se ...
- 翻译器DIY它———算在英文文本中的单词数,字符和行数
咳咳.这部分应该是序列化编译器DIY的,然而,在这样做DIY第一次使用前flex 为了练练手,对于后者的理解是有帮助. 在word 我经常看到一个字计数功能,因此,它是如何实现,当然,首先想到的是要经 ...
- swift UI特殊培训38 与滚动码ScrollView
有时我们适合页面的全部内容,我们需要使用ScrollView,额外的内容打通滚动. 什么样的宽度和高度首先,定义,健身器材轻松. let pageWidth = 320 let pageHeight ...