`
jinghuainfo
  • 浏览: 1528208 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

系统程序员成长计划-工程管理(三)

 
阅读更多

转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog
作者联系方式:李先静 <xianjimli at hotmail dot com>

系统程序员成长计划-工程管理(三)

函数库

现在我们用automake来管理我们前面所建立的函数库,这是一个基础的函数库,我们就把它命名为base吧。

o 目录结构
base 根目录
base/src 源代码目录

o 创建Makefile模板
base/Makefile.am内容为:
SUBDIRS=src

base/src/Makefile.am内容为:

lib_LTLIBRARIES=libbase.la

libbase_la_SOURCES= darray.c /

darray.h /

dlist.c /

dlist.h /

darray_iterator.h /

dlist_iterator.h /

hash_table.c /

hash_table.h /

invert.c /

iterator.h /

linear_container_darray.c /

linear_container_darray.h /

linear_container_dlist.c /

linear_container_dlist.h /

linear_container.h /

queue.c /

queue.h /

sort.c /

sort.h /

stack.c /

stack.h /

typedef.h

libbase_la_LDFLAGS=-lpthread

noinst_PROGRAMS=darray_test dlist_test

darray_test_SOURCES=darray.c

darray_test_CFLAGS=-DDARRAY_TEST

dlist_test_SOURCES=dlist.c

dlist_test_CFLAGS=-DDLIST_TEST

basedir=$(includedir)/base

base_HEADERS=darray.h dlist.h iterator.h linear_container_dlist.h typedef.h /

darray_iterator.h dlist_iterator.h linear_container_darray.h /

linear_container.h

EXTRA_DIST=/

linear_container_test.c /

invert_ng.c /

darray_iterator.c /

dlist_iterator.c /

test_helper.c

LTLIBRARIES是关键字。LT代表libtool,libtool是用来封装共享库在不同平台上差异的脚本,其具体实现我们不用关心。

libbase.la 是函数库的名称,扩展名用.la而不是.so或.a,同时会生成共享库和静态库。libbase_la_SOURCES是生成libbase.la所需要的源文件。
LDFLAGS是关键字,用来指定链接时需要的参数,-lpthread表示要链接libpthread.so。

noinst_PROGRAMS是关键字,表示不需要安装的可执行文件,通常是测试程序。为了简单明了,这里没有写出全部的测试程序。

CFLAGS是关键字,用来指定编译和预处理时的参数。

HEADERS是关键字,列出所要安装的头文件。xxx_HEADERS和xxxdir要配套使用,后者表示要安装的位置。这里在base_HEADERS中列出的头文件会安装到basedir目录里。

o 创建autoconf的模板。
运行:
autoscan
mv configure.scan configure.in

然后按前面介绍的方法修改configure.in,得到下面的内容:

AC_PREREQ(2.61)
AC_INIT(base, 0.1, xianjimli@hotmail.com)
AC_CONFIG_SRCDIR([src/invert.c])
AC_CONFIG_HEADER([config.h])
AM_INIT_AUTOMAKE(base, 0.1)
# Checks for programs.
AC_PROG_CC
AC_PROG_LIBTOOL

# Checks for libraries.
# FIXME: Replace `main' with a function in `-lpthread':
AC_CHECK_LIB([pthread], [main])

# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([stdlib.h string.h unistd.h])

# Checks for typedefs, structures, and compiler characteristics.
AC_C_INLINE
AC_TYPE_SIZE_T

# Checks for library functions.
AC_FUNC_MALLOC
AC_FUNC_REALLOC

AC_CONFIG_FILES([Makefile
src/Makefile])
AC_OUTPUT

与前面不同的是:
AC_PROG_LIBTOOL 用来检查libtool脚本。
AC_CHECK_LIB用来检查共享库是否存在。
AC_CHECK_HEADERS 用来检查头文件是否存在。
AC_FUNC_MALLOC 用来检查标准的malloc函数是否存在。

o 收集用到的m4宏。
运行:aclocal

o 产生配置头文件的模板。
运行:autoheader

o 创建README、NEWS、ChangeLog和AUTHORS几个文件。

o 生成libtool需要的文件。
运行:libtoolize –force –copy

这个命令的主要功能是生成ltmain.sh,而ltmain.sh用来产生libtool脚本。

o 生成Makefile.in和需要的脚本。
运行:automake -a

o 产生configure脚本。
运行:autoconf

o 产生最终的Makefile。
运行:./configure –prefix=$HOME/usr

o 编译运行:make

o 安装
运行:make install

o 发布软件包
运行:make dist

我们编译好的文件安装到/home/lixianjing/usr/lib/目录下了:
libbase.a libbase.la libbase.so libbase.so.0 libbase.so.0.0.0

静态库:libbase.a
动态库:libbase.so
libtool的包装:libbase.la

头文件和库都安装好了,调用者还需要知道下列信息才能使用:

头文件和库安装在哪里?
还依赖哪些其它模块?

为了解决这个问题,我们需要借助另外一个名为pkg-config的工具。pkg是package的简写,pkg-config负责查询指定软件包 的配置信息,如软件包的名称、说明、版本号、头文件、库和依赖关系等等。为了让pkg-config能正常工作,软件包的实现者需要提供一个扩展名为pc 的配置文件。

系统中的pkg-config配置文件通常放在/usr/lib/pkgconfig/和/usr/local/lib/pkgconfig/下,下面是gtk+-2.0.pc:

prefix=/usr
exec_prefix=/usr
libdir=/usr/lib
includedir=/usr/include
target=x11

gtk_binary_version=2.10.0
gtk_host=i386-redhat-linux-gnu

Name: GTK+
Description: GIMP Tool Kit (${target} target)
Version: 2.12.10
Requires: gdk-${target}-2.0 atk cairo
Libs: -L${libdir} -lgtk-${target}-2.0
Cflags: -I${includedir}/gtk-2.0

前面部分是定义的一些变量,后面是一些关键字:

Name: 名称
Description: 功能描述
Version: 版本号
Requires: 所依赖的软件包
Libs: 调用者的链接参数。
Cflags: 调用者的编译参数。

由于 prefix之类的变量是在软件包configure时才决定的,不能直接写死在pc文件中。我们可以让configure根据模板文件来产生。

模板文件名为base.pc.in,内容为:

prefix=@prefix@
exec_prefix=${prefix}
libdir=${prefix}/lib
includedir=${prefix}/include

Name: @PACKAGE_NAME@
Description: a basic library.
Version: @VERSION@
Requires:
Libs: -L${libdir} -lbase
Cflags: -I${includedir}/base

这个模板文件和Makefile.in的替换规则一样,用两个@@括起来的变量会替换成configure检测出来的值,@prefix@等变量是标准的变量。

修改一下base/Makefile.am,增加下列两行代码:

pkgconfigdir=${libdir}/pkgconfig
pkgconfig_DATA=base.pc

这是安装数据文件的方法,pkgconfig不是关键字,取个描述性的名称就好了。dir和_DATA是关键字,它们有相同的前缀,前者表示安装的目录,后者表示要安装的文件。按照惯例,pc文件安装到${libdir}/pkgconfig下。

修改configure.in,增加输入出文件base.pc
AC_OUTPUT([base.pc])

放到AC_CONFIG_FILES也可以,它告诉configure脚本要产生的文件。

重新运行configure后会生成base.pc,内容为:

prefix=/home/lixianjing/usr/local

exec_prefix=${prefix}

libdir=${prefix}/lib

includedir=${prefix}/include

Name: base

Description: a basic library.

Version: 0.1

Requires:

Libs: -L${libdir} -lbase

Cflags: -I${includedir}/base

(prefix与configure时指定的prefix参数一致。)

在下一节中,我们再学习调用者如何使用pc文件。

分享到:
评论

相关推荐

    一个开源通用的应用程序框架2版 (待参与)

    本版本自己实现Raize控件组中TCheckTree,并将所有与Raize控件相关代码更新,现在的版本不使用任何的第三方组件,DELPHI7下直接编译通过。这里要注意的是系统的初始密码,您如果看代码,在uAuthAppFactory单元,有一...

    积分管理系统java源码-DocCollection:文档集

    积分管理系统java源码 ...汇总java生态圈常用技术框架、开源中间件,系统架构、数据库、大公司架构案例、常用三方类库、项目管理、线上问题排查、个人成长、思考等知识 TheAlgorithms Github地址: 算法与数据结构

    自己动手写操作系统(含源代码).part2

    第三,实践类的操作系统书籍还是太少了,以至于你要想看看别人是怎么做的,除了读以《操作系统:设计与实现》为代表的极少数书籍之外,就是一头扎进源代码中,而结果有时相当令人气馁。我自己也气馁过,所以我在第二...

    自己动手写操作系统(含源代码).part1

    第三,实践类的操作系统书籍还是太少了,以至于你要想看看别人是怎么做的,除了读以《操作系统:设计与实现》为代表的极少数书籍之外,就是一头扎进源代码中,而结果有时相当令人气馁。我自己也气馁过,所以我在第二...

    软件开发人员薪酬设计方案(1).doc

    初级应用工程师、应用工程师、系统分析员和开发经理等技术职称分别对应不同的 工资等级范围,员工的工资水平既可随技术职称的提升而升至更高等级,也可以随业绩 的提升在同一工资等级范围内向上浮动。令每位软件...

    敏捷软件开发.pdf

     5A.3.4规划管控、Burn图和系统工程  5A.3.5用例和用户故事  5A.4经久不绝的问题  5A.4.1最佳击球点和下降  5A.4.2固定价格、固定范围的合同  5A.4.3敏捷、CMMI和ISO9001  5A.4.4何时停止建模  5A.4.5高科技...

    java版商城源码下载-awesome-jp:百宝箱

    生态圈常用技术框架、开源中间件,系统架构、数据库、大公司架构案例、常用三方类库、项目管理、线上问题排查、个人成长、思考等知识 :该项目是一系列小而专注的教程 - 每个教程都涵盖 Java 生态系统中单一且定义...

    深入理解Android:卷I--详细书签版

     第7章阐述了Audio系统中的三位重要成员AudioTrack、AudioFlinger和AudioPolicyService的工作原理。本章拓展思考部分分析了AudioFlinger中DuplicatingThread的工作原理,并且和 读者一道探讨了单元测试、ALSA、...

    SVN培训资料.pptx

    TortoiseSVN:是SVN客户端程序,为windows外壳程序集成到windows资源管理器和文件管理系统的Subversion客户端。SVNService.exe:是专为 SubVersion 开发的一个用来作为 Win32 服务挂接的入口程序。 SVN培训资料全文...

    代码大全中文版

    由于本书的中心内容是广大程序员们所熟知的实现过程,因此,无论是受过正规训练而已经验丰富的程序员,还是完全靠自学成长起来的程序员,都能容易读懂本书所论述的先进技术和方法。 自学成才的程序员  ...

    编程高手箴言(推荐)

    1.2.1 高手成长的六个阶段 5 1.2.2 初级程序员和高级程序员的区别 7 1.2.3 程序员是吃青春饭的吗 9 1.3 正确的入门方法 11 1.3.1 规范的格式是入门的基础 13 1.3.2 调试的重要性 17 1.4 开放性思维 18 1.4.1 动态库...

    编程高手箴言(中文完整版)(13M)

    1.2.1 高手成长的六个阶段 5 1.2.2 初级程序员和高级程序员的区别 7 1.2.3 程序员是吃青春饭的吗 9 1.3 正确的入门方法 11 1.3.1 规范的格式是入门的基础 13 1.3.2 调试的重要性 17 1.4 开放性思维 18 1.4.1 动态库...

    皮肤控件研究文档,破解后的库文件,皮肤设计工具使用教程

    界面与逻辑分开,让程序员有更多的时间去进行软件内部的逻辑处理。SkinSE没有采用传统的HOOK修改窗口过程函数的方式 ,而是只是针对具体窗口进行界面处理。SkinSE只用到了windows几个底层的核心库,没有用到(MFC/ATL...

Global site tag (gtag.js) - Google Analytics