写在前面
C/C++编译成二进制和编译成库文件可以通过gcc/g++实现,但若处理多个文件时,利用gcc/g++就显得较为麻烦,故出现了利用Makefile自动编译。Makefile让编译器知道要编译一个文件需要依赖其他的哪些文件,当那些依赖文件有了改变,编译器会自动的发现最终的生成文件已经过时,而重新编译相应的模块。
Makefile文件可以手动编写,也可以自动生成。自动生成Makefile文件的工具有automake和cmake,这里主要介绍automake工具 工作流程。
这里基于《Linux下编译C/C++二进制文件和动态链接库并调用》中的myAPI.cpp、myAPI.h进行实验。将myAPI.cpp利用Makefile文件在生成deb包时自动编译成库文件(.so文件)。
automake生成Makefile流程
(开始最好创建一个目录,然后在该目录下进行后续操作,这里我创建了一个automake_test目录)
1、将需要编译的源码文件拷到该目录下,这里是myAPI.cpp和myAPI.h文件。
创建Makefile.am文件,并对其进行编辑。文件内容如下:
lib_LTLIBRARIES = libmyAPI.la
libmyAPI_la_SOURCES = myAPI.cpp
include_HEADERS = myAPI.h
2、执行autoscan命令,得到configure.scan文件,然后将该文件改名为configure.ac,并对其进行编辑,修改内容如下:
主要是修改AC_INIT和添加AM_INIT_AUTOMAKE、AC_PROG_LIBTOOL
包名我这里设置为“myapi”、版本号设置为“3.0”(这里可以根据自己的需要自行设置)
3、执行aclocal命令,生成autom4te.cache(这里就是个中间文件,可以不用管)
4、执行autoconf命令,生成文件configure。(这个文件比较重要,后面生成Makefile需要用到)
5、执行autoheader命令,生成config.h.in。
6、执行automake --add-missing 命令,根据configure.ac文件的内容安装了一些文件。
这里报错,原因是缺少一些目录,创建缺少的目录。(这里AUTOHORS应该是AUTHORS,手误)
再次automake
这里又报错了,找到的解决方法,
再 $libtoolize --automake --copy --debug --force
然后automake成功
7、执行./configure生成Makefile文件
8、以上就已经生成了我们所需要的Makefile文件,若想直接生成库文件,可以执行make命令
deb包生成过程
首先执行make distclean,将之前make生成的一些文件删除掉(通过make编译生成的库文件等),然后使用编包的方法来编译库文件。
因为在编包的时候会生成一些文件,为了使我们能更清楚的找到这些生成的文件并保持目录的干净,这里我们创建一个目录automake_debian_test,将刚刚是automake_test目录拷贝到此目录下,此时我们主要做的就是将automake_test打包成deb包。
这里直接将automake_test打包是不合适的,因为包名含有下划线,且未说明版本号,故将包名改为automake-myapi-3.0,然后再将该目录压缩成.tar.gz
前面都为准备工作,下面我们进入automake-myapi-3.0目录,也为工作目录,源码包目录。执行dh_make创建Debian目录。
一般需要修改debian/changelog 和 debian/control 文件,修改完成后,回到工作目录下,执行debuild命令
回到automake_debian_test目录下,可以看到编译好的deb 包
进入对应目录可以查看生成的库文件。
安装deb包并调用库文件
调用库文件
运行