使用autotools生成Makefile(三) 生成库文件(.so和.a) 、安装、打包

一、代码详情

见上一篇博客。

下载代码:
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、代码详情
1

三、创建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

2执行automake --add-missing,报了一个错误 error: required file ‘./ltmain.sh’ not found
3解决办法,执行

libtoolize --automake --copy --debug --force

再执行automake --add-missing就发现没有报错了。最后执行./configure,各目录下Makefile文件都生成了。


五、执行make,看看都生成了些什么

1、test_src/moudle1目录
4我们看到.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目录
5
这里我们特别注意到一点,我们看到生成了可执行文件sample有两个,一个在test/test_example,一个在test/test_example/.libs/ 下
我们用file命令来看看:
8可以看出在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 后,看看安装的目录有些什么 ?
6
因为不想生成静态库,所以也没生成静态库.a。


七、打包

make dist



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值