C++工程管理中autoconf使用

原创 2015年07月10日 15:32:55
build C++工程一般步骤?


     C++工程比Java工程需求较少,C++工程的build一般包括:生成配置boot、配置configure、编译make、安装install。编译一般输入是源文件,输出是可执行文件、静态或者动态库;安装一般是将可执行文件或者库拷贝到目标文件夹下。Java工程要求还包括:编译之前检查版本、依赖文件、获取依赖;编译后输出说明文档、输出依赖、进行单元测试;安装时候设置环境变量、获取其他库或者依赖、启动某些服务等。总结起来,工程构建几步如下,Java在其他地方说明。
<ul name = C++>
     <li>Boot:一般是使用autoreconf工具生成configure文件和Makefile。</li>
     <li>Configure:检查依赖及依赖的版本。</li>
     <li type = make stage>
          <p>make:编译库或者可执行文件。</p>
          <p>make test:生成单元测试。</p>
     </li>
     <li type = install stage>
          <p>install:安装可执行文件或者库,生成release信息等。</p>
          <p>unit test:C++工程一般需要shell脚本手动运行test。</p>
     </li>
</ul>




什么工具比较好?


     原始阶段,C++工程是手工或者shell脚本进行make和install,后来出现了GNU make,这样可以自动化make和install。后来出现了automake、autoconf,可以自动生成配置与Makefile。本文重点讲述autoconf如何使用。
<ul>
     <li>autoconf中文手册:http://www.cnblogs.com/fengwei/p/4394165.html</li>
     <li>automake</li>
     <li>libtool</li>
</ul>
     autoconf中Makefile.am组织方式有两种,一种是顶层一个Makefile.am或者顶层Makefile切分放到底层目录然后顶层目录再include;另一种是每一层都有一个Makefile。这两种最大的区别就是,第一种一个宏全局有效(后面都是使用+=方式追加,例如OVS工程管理),第二种是宏本层有效(例如openrouter)。




哪个工程这样使用?


     首先分析多层Makefile.am的工程,openrouter-1.6为例(http://www3.openrouter.org/livecd.html),使用autoconf+automake+libtool。一般这样的工程都会写好脚本,我们只要知道怎么增量开发就好。
     以openrouter-1.6中nsx-integration为例,其中xrl、CMD部分请看其他,这里假定源文件都OK了。首先创建nsx_integration文件夹,修改顶层(即nsx_integration上级目录Makefile.am) :
<ul>
     <li>SUBDIRS +=  lacp lldp mstp system snmp dhcp igmpsnooping shell dot1x nsx_integration</li>
     <li>IST_SUBDIRS    = ... nsx_integration</li>
<ul>
可见顶层目录负责指定src与dst。
     然后创建nsx_integration文件夹下的Makefile.am。
<p>
####################
# nsx_integration工程几部分:
#     nsx_integration程序源代码,在本目录
#     libvtepctl.la,在本目录
#     ovs库,在./ovs目录
#     系统库ssl,crypto,pthread,这个路径就使用环境变量吧
# 由于是每层单独使用Makefile.am这样的结构,所以每个
# Makefile.am都单独使用目标宏,所以看的都是重定义。
####################
# 1. 定义编译目录。
SUBDIR = ovs/lib . tools


# 2. 定义文档。
#     datadri、data_DATA,这个好像是检查这个data文件是否存在
datadir = $(prefix)/bin/$(subdir)
data_DATA = ./ovs/vtep/vtep.ovsschema


# 3. 定义目标。
#      注意这里的$(subdir)使用了上面SUBDIRS定义的所有subdir
bindir = $(prefix)/bin/$(subdir)     # 目标目录
bin_PROGRAM = openrouterlus_nsx       # 目标1,openrouterlus_nsx
#     特别注意noinst_XXX,是指下面这个可执行文件或者库
#     不想被安装到系统中(也就是使用make install命令对下面这个文件没用)
noinst_LTLIBERARIES = libvtepctl.la     # 目标2,libvtepctl.la库


# 4. 定义静态依赖。
#     在实际工程中一个目标生成最好使用静态库或者源代码,因为动态库涉及到升级、路径等较多问题。
#     但是Java就全部是动态的依赖,所以Java升级更方便。但是Java对工程的管理要求更高,
#     所以Java使用更高级的Maven来进行管理。
openrouterlus_nsx_LADD = ...


# 5. 定义源文件。
#     源文件很简单了,就是把本目录下文件加上就行,由于现在使用的是多层Makefile.am方式,
#     深层文件自会有人负责。
openrouterlus_nsx_SOURCES = ...


# 6. 定义libvtepctl.la的源文件与编译选项
libvtepctl_la_CFLAGS   = -Wno-sign-compare                                      
libvtepctl_la_SOURCES  = ...


# 7. 定义INCLUDE
INCLUDES = ...


# 要注意的是Makefile.am中顺序不重要。
</p>


     然后分析单层Makefile.am工程,例如OVS。首先先从底层分割的Makefile.am开始,顶层Makefile.am基本是CFLAG定义。以vtep中Makefile.am为例:
<p>
# 略过其他
# 1. 定义bin目标
#     由于使用单Makefile.am结构而不是层次结构,所以这里的目录结构是这样
bin_PROGRAMS += vtep/vtep-ctl


# 2. 定义源文件
#     再次注意目录结构
vtep_vtep_ctl_SOURCES = vtep/vtep-ctl.c


# 3. 库文件
vtep_vtep_ctl_LDADD = lib/libopenvswitch.la 
</p>
顶层Makefile.am只需要include底层目录的Makefile.am即可。除了上述的编译用途之外还有:生成man文件,生成其他文档。再以./vswitchd/中添加inventory功能为例:
<p>
# 1. 源文件中增加
# 2. EXTRA_DIST中增加
# 3. schema检查
# 4. CLEANFILES
</p>













































Visual C++ 6.0 工程管理器 1.0

  • 2009年05月25日 21:46
  • 875KB
  • 下载

Makefile工程管理语法与使用技巧

使用GNU Make工具来管理程序是每个Linux工程师必须掌握的技能。Make能够使整个程序的编译、链接只需要一个命令(make)就可以完成。           Make的工作主要依赖于一个...

使用Notepad++的工程管理视图

环境:Notepad++ v6.3.2 1、点击菜单:视图==>工程==>工程面板1~3,有三个工程面板可用 2、打开一个工程面板后,主面板右边会出现“工程”面板 ...

在LINUX环境下工程管理器make的使用

工程管理器,顾名思义,是指管理较多的文件 Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefi...
  • zggzgw
  • zggzgw
  • 2017年01月18日 20:55
  • 282

工程管理器make和模板的使用

一、编写规则: 1.由make工具创建的目标体 2.创建目标体所依赖的文件 3.创建目标体所运行的命令,同时以制表符开头 二、格式: target:dependency_files    comma...

使用Notepad++的工程管理视图

环境:Notepad++ v6.3.2 1、点击菜单:视图==>工程==>工程面板1~3,有三个工程面板可用 2、打开一个工程面板后,主面板右边会出现“工程”面板 ...

工程管理器及makefile模板的使用

1.概念和基础 工程管理器,顾名思义,是指管理较多的文件  Make工程管理器也就是个“自动编 译管理器”,这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件 而减少编译的工作量,同时...

Linux下调试器 GDB和工程管理器MAKE  应用详解!

调试器 GDB   1.启动被调试程序   2.设置断点   3.查看断点处变量的值     调试选项  -g            gcc -g text.c -o text       gdb t...

位运算符、函数、全局变量与工程管理

位运算发、函数、全局变量与工程管理
  • wrx1995
  • wrx1995
  • 2015年10月17日 15:39
  • 329

Maven分模块分工程管理

分模块分工程的作用是为了将工作可以细化到每个工作组,最后可以统一的整合项目。且每个单独的module可以独立运行调试。 顶级项目为project,子项目为module。 1、创建maven...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++工程管理中autoconf使用
举报原因:
原因补充:

(最多只允许输入30个字)