(第七章 1)C工程管理: 做一个库和使用库 !未完待续!
?
2. 在base和base/src下创建Makefile.am文件
base/Makefile.am
SUBDIRS=srcpkgconfigdir=${libdir}/pkgconfigpkgconfig_DATA=base.pc
pkgconfig不是关键字;
dir表示要安装的目录;_DATA表示要安装的文件(两者配合使用)。这里指定了pc文件要被安装到哪里
libdir会被换成base.pc.in中相应的值(它最终由./configure --prefix=...指定的值确定)
?
base/src/Makefile.am
lib_LTLIBRARIES=libbase.lalibbase_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=-lpthreadnoinst_PROGRAMS=darray_test dlist_testdarray_test_SOURCES=darray.cdarray_test_CFLAGS=-DDARRAY_TESTdlist_test_SOURCES=dlist.cdlist_test_CFLAGS=-DDLIST_TESTbasedir=$(includedir)/basebase_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.hEXTRA_DIST=\linear_container_test.c \invert_ng.c \darray_iterator.c \dlist_iterator.c \test_helper.c
lib_LTLIBRARIES=libbase.la????????????????? 共享库用扩展名.la可以同时生成共享库和静态库。
?
libbase_la_SOURCES=... ? ? ? ? ? ? ? ? ? ? ? libbase.la编译时需要的源文件
libbase_la_LDFLAGS=-lpthread ? ? ? ? ?? libbase.la链接时需要的参数
?
noinst_PROGRAMS=darray_test? dlist_test??????? 关键字noinst_PROGRAMS指定不需要安装的的可执行文件
?
darray_test_SOURCES=darray.c??????????????????????? darray.c --编译--> darray_test
darray_test_CFLAGS=-DDARRAY_TEST? ? ? ? ?? 编译和预处理darray.c时需要的参数
?
basedir=$(includedir)/base
base_HEADERS=darray.h? dlist.h? iterator.h ...?????? 配套使用,将_HEADERS列出的头文件安装到dir路径
注: $(includedir)在base.pc.in中指定
?
3.定制configure.in
#autoscan
autom4te: configure.ac: no such file or directory
autoscan: /usr/bin/autom4te failed with exit status: 1
#ls
autoscan.log??? configure.scan ?? Makefile.am??? src
#mv configure.scan configure.in
?
将configure.in稍作修改
# -*- Autoconf -*-# Process this file with autoconf to produce a configure script.AC_PREREQ(2.59)#AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)AC_INIT(base, 0.1, chuanwang66@163.com) #修改AC_CONFIG_SRCDIR([src/typedef.h])AC_CONFIG_HEADER([config.h])AM_INIT_AUTOMAKE(base, 0,1) #新增# Checks for programs. AC_PROG_CCAC_PROG_LIBTOOL #新增# Checks for libraries.# FIXME: Replace `main' with a function in `-lpthread':AC_CHECK_LIB([pthread], [main])# Checks for header files.AC_HEADER_STDCAC_CHECK_HEADERS([stdlib.h string.h unistd.h])# Checks for typedefs, structures, and compiler characteristics.AC_C_INLINEAC_TYPE_SIZE_T# Checks for library functions.AC_FUNC_MALLOCAC_FUNC_REALLOCAC_CONFIG_FILES([Makefile src/Makefile])AC_OUTPUTprefix=@prefix@ #修改, 等到安装时./configure --prefix=... 就可以指定这个变量值exec_prefix=${prefix} #修改libdir=${prefix}/lib #修改,库文件安装在此includedir=${prefix}/include #修改,头文件安装在此Name: gtk-engines-2Description: GTK+ Theme EnginesVersion: 2.8.0Requires: gtk+-2.0Libs: -L${libdir} -lbase #这个函数库的库文件可以在${libdir}中找到Cflags: -I${includedir}/base #这个函数库的头文件可以在${includedir}/base中找到
?
三、安装这个函数库
?
#mkdir /home/hadoop/usr
#cd /home/hadoop/base
#./configure --prefix=$HOME/usr
#make
#make install
#make dist
?
四、应用工程中使用一个第三方函数库
?
1. 创建工程结构和源码
#pwd
/home/hadoop
#mkdir appdemo
#mkdir appdemo/src
#vi appdemo/src/main.c
#include <dlist.h>int main(int argc, char* argv[]){ DList* dlist=dlist_create(NULL, NULL); dlist_destroy(dlist); return 0;}?
?
2. 创建appdemo/Makefile.am和appdemo/src/Makefile.am
appdemo/Makefile.am
SUBDIRS=src
appdemo/src/Makefile.am
bin_PROGRAMS=appdemoappdemo_SOURCES=main.cappdemo_CFLAGS=@BASE_CFLAGS@appdemo_LDFLAGS=@BASE_LIBS@
?
3. 创建configure.in
# autoscan
#mv configure.scan configure.in
修改configure如下:
# -*- Autoconf -*-# Process this file with autoconf to produce a configure script.AC_PREREQ(2.59)AC_INIT(appdemo, 0.1, chuanwang66@163.com) #修改AC_CONFIG_SRCDIR([config.h.in])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_OUTPUTPKG_CHECK_MODULES(BASE, ["base"]) #新增,调用pkg-config检查软件包base(生成BASE_CFLAGS和BASE_LIBS两个变量)AC_SUBST(BASE_CFLAGS) #新增,将Makefile.am中的BASE_CFLAGS替换成上面检查出来的值AC_SUBST(BASE_LIBS) #新增,将Makefile.am中的BASE_LIBS替换成上面检查出来的值
?
4. 傻乎乎一阵命令
#aclocal
#autoheader
?
5. 创建 NEWS、README、AUTHORS、ChangeLog
6.
#automake -a
#autoconf
#export PKG_CONFIG_PATH=/home/hadoop/usr/lib/pkgconfig
#./configure --prefix=/home/hadoop/usr
#make?? ???可以我在这里出错了,为何呢
#make install
#make dist
?
?
?