首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 其他相关 >

(第七章 一)C工程管理: 做一个库和使用库 !未完待续

2013-03-12 
(第七章 1)C工程管理: 做一个库和使用库!未完待续!?2. 在base和base/src下创建Makefile.am文件 base/Makef

(第七章 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_OUTPUT
prefix=@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.amappdemo/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

?

?

?

热点排行