一、代码详情
见上一篇博客。
下载代码:
1、源代码:autotools测试代码
2、打包:最后打包,直接configure
二、创建各个目录下的Makefile.am
1、顶层目录
SUBDIRS = test_src test_example
2、test_src 目录 Makefile.am:
SUBDIRS = moudle1 moudle2 moudle3
3、test_src/moudle1 目录 Makefile.am:
NULL =
# 这里使用libtool工具生成库文件,包含动态库.so 和 静态库.a
# 如果不想生成静态库:./configire --disable-static
# 如果不想生成动态库:./configire --disable-shared
lib_LTLIBRARIES = libmoudle1.la
# $(includdir)的值由autoconf为我们自动生成,默认是'/urs/include' 或 '/usr/local/include'
# _CPPFLAGS指定预处理阶段头文件的查找目录(gcc -I)
libmoudle1_la_CPPFLAGS = \
-I$(includedir) \
$(NULL)
# automake可以从autoconf继承变量
# 即Makefile文件用到下列变量时可以在configure脚本文件中寻找这些变量的定义
# 当然,这些变量最初是由开发者在configure.ac文件中增加的
# _LIBADD指定链接阶段so库的查找路径(gcc -l)
libmoudle1_la_LIBADD = \
$(NULL)
libmoudle1_la_SOURCES = m1_f1.c m1_f1.h m1_f2.c m1_f2.h
# 指定make install要安装的头文件具体路径,在生成的Makefile文件中,会自动加上$(DESTDIR)前缀
# 生成动态库这个很重要,如果没有安装头文件怎么能使用动态库呢
# $(includdir)的值由autoconf为我们自动生成,默认是'/urs/include' 或 '/usr/local/include'
# 安装头目录可以在./confugie --includedir= 指定
libmoudle1_includedir=$(includedir)
#指定make install要安装哪些头文件
libmoudle1_include_HEADERS = \
m1_f1.h \
m1_f2.h \
$(NULL)
# 开启对DESTDIR的定义后,执行make install会将库、.h 文件安装到项目目录下 $(abs_top_srcdir)/usr/local/
# 若不开启,sudo make install可以将库、.h文件安装到系统目录下/usr/local/
#DESTDIR = $(abs_top_srcdir)
4、test_src/moudle2 目录 Makefile.am:
NULL =
lib_LTLIBRARIES = libmoudle2.la
# $(includdir)的值由autoconf为我们自动生成,默认是'/urs/include' 或 '/usr/local/include'
# _CPPFLAGS指定预处理阶段头文件的查找目录(gcc -I)
libmoudle2_la_CPPFLAGS = \
-I$(includedir) \
$(NULL)
# automake可以从autoconf继承变量
# 即Makefile文件用到下列变量时可以在configure脚本文件中寻找这些变量的定义
# 当然,这些变量最初是由开发者在configure.ac文件中增加的
# _LIBADD指定链接阶段so库的查找路径(gcc -l)
libmoudle2_la_LIBADD = \
$(NULL)
libmoudle2_la_SOURCES = m2_f1.c m2_f1.h m2_f2.c m2_f2.h
#指定make install要安装的头文件具体路径
#在生成的Makefile文件中,会自动加上$(DESTDIR)前缀
libmoudle2_includedir=$(includedir)
#指定make install要安装哪些头文件
libmoudle2_include_HEADERS = \
m2_f1.h \
m2_f2.h \
$(NULL)
5、test_src/moudle3 目录 Makefile.am:
NULL =
lib_LTLIBRARIES = libmoudle3.la
# $(includdir)的值由autoconf为我们自动生成,默认是'/urs/include' 或 '/usr/local/include'
# _CPPFLAGS指定预处理阶段头文件的查找目录(gcc -I)
libmoudle3_la_CPPFLAGS = \
-I$(includedir) \
$(NULL)
# automake可以从autoconf继承变量
# 即Makefile文件用到下列变量时可以在configure脚本文件中寻找这些变量的定义
# 当然,这些变量最初是由开发者在configure.ac文件中增加的
# _LIBADD指定链接阶段so库的查找路径(gcc -l)
libmoudle3_la_LIBADD = \
-L../moudle1/ \
-L../moudle2/ \
-lmoudle1 \
-lmoudle2
$(NULL)
libmoudle3_la_SOURCES = m3_f1.c m3_f1.h m3_f2.c m3_f2.h
#指定make install要安装的头文件具体路径
#在生成的Makefile文件中,会自动加上$(DESTDIR)前缀
libmoudle3_includedir=$(includedir)
#指定make install要安装哪些头文件
libmoudle3_include_HEADERS = \
m3_f1.h \
m3_f2.h \
$(NULL)
6、test_example 目录下Makefile.am
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = sample
sample_LDADD = \
-L../test_src/moudle3/ \
-lmoudle3
sample_SOURCES = sample.c
7、代码详情
三、创建configure.ac文件
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT([test_so_sample], [1.0.0], [qigaohua@xxx.com])
AM_INIT_AUTOMAKE(test_so_sample, 1.0.0)
AC_CONFIG_SRCDIR([test_example/sample.c])
AC_CONFIG_HEADERS([config.h])
# Checks for programs.
AC_PROG_CC
# 用于生成动态库
AC_PROG_LIBTOOL
LT_INIT
# la 是否生成.so 或 .a, 好像没有起作用
AC_ENABLE_SHARED(yes)
AC_ENABLE_STATIC(no)
# Checks for libraries.
# FIXME: Replace `main' with a function in `-lmoudle1':
AC_CHECK_LIB([moudle1], [main])
# FIXME: Replace `main' with a function in `-lmoudle2':
AC_CHECK_LIB([moudle2], [main])
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_CONFIG_FILES([Makefile
test_example/Makefile
test_src/Makefile
test_src/moudle1/Makefile
test_src/moudle2/Makefile
test_src/moudle3/Makefile])
AC_OUTPUT
四、生成Makefile
执行一般步骤
aclocal
autoconf
autoheader
touch NEWS README AUTHORS ChangeLog
automake --add-missing
./configure
执行automake --add-missing,报了一个错误 error: required file ‘./ltmain.sh’ not found
解决办法,执行
libtoolize --automake --copy --debug --force
再执行automake --add-missing就发现没有报错了。最后执行./configure,各目录下Makefile文件都生成了。
五、执行make,看看都生成了些什么
1、test_src/moudle1目录
我们看到.libs/ 目录下有我们期望的库文件.a静态库 和 .so 动态库。再看看libmoudle1.la文件内容:
# libmoudle1.la - a libtool library file
# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-14
#
# Please DO NOT delete this file!
# It is necessary for linking the library.
# The name that we can dlopen(3).
dlname='libmoudle1.so.0'
# Names of this library.
library_names='libmoudle1.so.0.0.0 libmoudle1.so.0 libmoudle1.so'
# The name of the static archive.
old_library='libmoudle1.a'
# Linker flags that cannot go in dependency_libs.
inherited_linker_flags=''
# Libraries that this one depends upon.
dependency_libs=''
# Names of additional weak libraries provided by this library
weak_library_names=''
# Version information for libmoudle1.
current=0
age=0
revision=0
# Is this an already installed library?
installed=no
# Should we warn about portability when linking against -modules?
shouldnotlink=no
# Files to dlopen/dlpreopen
dlopen=''
dlpreopen=''
# Directory that this library needs to be installed in:
libdir='/usr/local/lib'
test_src/moudle2 和 test_src/moudle3目录和上面内容差不多。
2、test/test_example目录
这里我们特别注意到一点,我们看到生成了可执行文件sample有两个,一个在test/test_example,一个在test/test_example/.libs/ 下。
我们用file命令来看看:
可以看出在test/test_example目录下的sample 是个脚本文件,而在test/test_example/.libs/才是我们的可执行文件。
sample 脚本会根据脚本中的内容在当前目录 .deps .libs 目录下查找依赖,运行.libs下的可执行文件sample。
六、试试make install
我们将这些安装到我们指定的目录(默认目录是/usr/local/),同时也不想生成静态库。
首先我们重新./configure,执行:
./configure --prefix=/home/qigaohua/work/test/install/ --disable-static
/home/qigaohua/work/test/install/ 这个是我们指定的安装目录。
make && make install 后,看看安装的目录有些什么 ?
因为不想生成静态库,所以也没生成静态库.a。
七、打包
make dist