静态库编译
目录结构:
base
|---src
|----|----Makefile.am
|----|----darray.c
|----|----darray.h
|----|----dlist.c
|----|----dlist.h
|----|----....
|---Makefile.am
|---configure.in
|---base.pc.in
1、编译脚本
#!/bin/bash
touch NEWS README ChangeLog AUTHORS COPYING
cp -f /usr/share/automake-1.9/compile .
cp -f /usr/share/automake-1.9/depcomp .
aclocal
libtoolize
autoheader
automake -a
autoconf
./configure --prefix=/usr/lib
make
2、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
这样做的好处是不论换到什么机器,什么平台,只要存在这个配置文件,那么都不会出现找不到库的问题。
3、base/Makefile.am
这个文件编写非常简单,只需要指定子文件夹即可,与以往唯一不同的地方是,要引入base.pc文件。
如下:
SUBDIRS=src
pkgconfigdir=$(libdir)/pkgconfig
pkgconfig_DATA=base.pc
4、base/src/Makefile.am
这个要比根目录下的要复杂的多,现在一行一行分析
lib_LTLIBRARIES=libbase.la #这是要生成的库,LTLIBRARIES是关键字
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 #noinst代表不要安装可执行程序,如果要安装则可写成bin_PROGRAMS
darray_test_SOURCES=darray.c #测试用到的源文件,注意,SOURCES是关键字,不允许出现点,遇到点的一切都用下划线代替
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
5、configure.in文件
这个文件由autoscan生成,但要针对具体情况做下修改
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.64])
AC_INIT(base, 0.01, richard.lion.heart.gl@gmail.com)
AC_CONFIG_SRCDIR([src/darray.c])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE(base, 0.01)
# Checks for programs.
AC_PROG_CC
AC_PROG_LIBTOOL#因为我们要制作库
AM_PROG_CC_C_O
AC_PROG_MAKE_SET
# Checks for libraries.
# FIXME: Replace `main' with a function in `-lpthread':
AC_CHECK_LIB([pthread], [main])
# Checks for header files.
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([base.pc]) #这是要生成软件包信息的文件