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

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

作者联系方式:李先静

应用程序

前面我们创建的helloworld是一个应用程序工程,它很简单,只使用了标准C的函数。现在我们要建立一个应用程序工程,它将使用前面所写的libbase函数库。

o目录结构

最顶层目录名用模块名称,这里用appdemo。
源文件放在模块下的src子目录里,即appdemo/src。

o 创建源文件

在src下创建源文件main.c,内容只是简单的调用一下libbase里的函数。

#include <dlist.h> 

int main(int argc, char* argv[])
{
    DList* dlist = dlist_create(NULL, NULL); 

    dlist_destroy(dlist); 

    return 0;
}

o 创建Makefile模板

创建helloworld/Makefile.am,内容为:
SUBDIRS=src

这里只有简单的一行代码,表示其下有一个src的子目录,如果有多个子目录,用空格分开就行了。

创建helloworld/src/Makefile.am,内容为:

bin_PROGRAMS=appdemo
appdemo_SOURCES=main.c
appdemo_CFLAGS=@BASE_CFLAGS@
appdemo_LDFLAGS=@BASE_LIBS@

appdemo_CFLAGS指定了编译appdemo时需要的参数,@BASE_CFLAGS@ 将替换成实际configure时所得到的参数。

appdemo_LDFLAGS是链接appdemo时需要的参数。@BASE_LIBS@ 将替换成实际configure时所得到的参数。
至于@BASE_CFLAGS@和@BASE_LIBS@是怎么得到的,后面我们再讲。

o 创建autoconf的模板。

在appdemo下运行autoscan,生成文件configure.scan,把它改名为configure.in。这是autoconf的模板文件,它的内容大概为:

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script. 

AC_PREREQ(2.61)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([src/main.c])
AC_CONFIG_HEADER([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_CONFIG_FILES([Makefile
                 src/Makefile])
AC_OUTPUT

按照前面介绍的方法,把configure.in的内容修改为:

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script. 

AC_PREREQ(2.61)
AC_INIT(appdemo, 0.1, xianjimli@hotmail.com)
AC_CONFIG_SRCDIR([src/main.c])
AC_CONFIG_HEADER([config.h])
AM_INIT_AUTOMAKE(appdemo, 0.1)
# 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_CONFIG_FILES([Makefile
                 src/Makefile])
AC_OUTPUT

与前面不同的是,我们还需要在# Checks for libraries. 之后加检查libbase参数的宏:

PKG_CHECK_MODULES(BASE, ["base"])
AC_SUBST(BASE_CFLAGS)
AC_SUBST(BASE_LIBS)

PKG_CHECK_MODULES(BASE, [“base”]) 的功能是检查软件包base,通过调用前面所讲的pkg-config,生成 BASE_CFLAGS和 BASE_LIBS两个变量。

AC_SUBST(BASE_CFLAGS) 的功能是把所有对 BASE_CFLAGS的引用替换成实际的参数。

o 拷贝所用到宏。
运行:aclocal

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

o 创建几个必要的文件。

README:描述模块的功能、用法和注意事项等。
NEWS:描述模块最新的动态。
AUTHORS:模块的作者及联系方式。
ChangeLog:记录模块的修改历史,它有固定的格式:

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

o 产生configure脚本。
运行:autoconf

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

这时会出现错误:

No package 'base' found 

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

在默认情况下,pkg-config只是在/usr/lib/pkgconfig下查找相关的pc文件。如果pc文件安装在其它目录,需要设置环境变量 PKG_CONFIG_PATH。

export PKG_CONFIG_PATH=$HOME/usr/lib/pkgconfig

重新configure,一切正常了。
o 编译
运行:make

o 安装
运行:make install

o 发布软件包
运行:make dist或者make distcheck

本章所讲的内容中可应付90%的情况了,如果需要使用更高级的特性,可以阅读相应的手册。

转载:https://www.cnblogs.com/zhangyunlin/archive/2009/04/14/6167541.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值