最近改一个项目,项目使用C++实现的,以前的师兄们使用的是automake进行编译,上次学习了使用automake进行编译,觉得已经会了,可是一到实践的时候就发现很多问题,特别是使用链接库的时候发现不会了。后来学习了一下,现在将使用方法记录下来,以后复习,也希望可以让遇到问题的朋友找到参考。
1、使用automake生成动态链接库
假设我们现在有一个项目,目录为test,test下面有两个子目录fun和src(文件的命名不是很规范,望大家见谅),在fun目录下有Fun.cpp和Fun.h两个源文件,现在想将这两个源文件编译生成一个动态链接库libfun.so,在src目录下有main.cpp文件,main.cpp文件将会调用libfun.so动态库。
使用automake编译的过程如下:
在fun目录下新建一个文件Makefile.am,文件内容为:
AUTOMAKE_OPTIMONS = foreign
lib_LTLIBRARIES = libfun.la
libfun_la_SOURCES = Fun.h Fun.cpp
AUTOMAKE_OPTIONS 是Automake 的选项。Automake 主要是帮助开发 GNU 软件的人员来维护软件,所以在执行Automake 时,会检查目录下是否存在标准 GNU 软件中应具备的文件,例如 'NEWS'、'AUTHOR'、 'ChangeLog' 等文件。设置为foreign 时,Automake会改用一般软件的标准来检查。如果不加这句的话,需要在autoconf之前,先执行touch NEWS README AUTHORSChangeLog 来生成'NEWS'、'AUTHOR'、 'ChangeLog' 等文件用automake生成动态链接库。
lib_LIBRARIES表示将会生成动态链接库,等号后面是动态链接库的名字,注意以.la为扩张名。
第三行说明生成动态链接库需要的文件。
在src目录下新建文件Makefile.am,内容为:
AUTOMAKE_OPTIMONS = foreign
INCLUDEES = -I../fun/
bin_PROGRAMS = test
test_SOURCES = Fun.h Fun.cpp
test_LDADD = -L../fun -lfun
其中INCLUDES表示的是最终程序需要包含的其他头文件的目录,如果有多个目录用空格分隔。
bin_PROGRAMS表示的是最终生成的可执行程序的程序名。
RESOURCES表示的是生成可执行程序所用到的源文件。
第四行表示的是所使用的动态链接库的路径(注意后面使用的是LDADD)
在项目根目录test下运行autoscan,将生成的configure.scan改为configure.in,修改configure.in的内容,内容修改如下所示:
需要修改的地方有AC_INIT,括号中需要填的是最终发布程序的名称,版本号,作者联系方式。
添加AC_INIT_AUTOMAKE一行;
添加AC_PROG_LIBTOOL一行(表明使用动态库)
运行aclocal、libtoolize -f -c、autoconf、autoheader命令。
新建文件Makefile.am,文件内容为:
第一行仍然是规格说明,如果没有这一行automake会要求有README NEWS等文件,这时候需要使用touch NEWS README AUTHORS ChangLog命令来生成需要的文件。
第二行说明项目的相关makefile所在的路径。不过最好将fun放在src前面,否则需要先在fun目录下运行make然后才能在根目录运行,否则会报错找不到动态库。原因应该是运行的顺序是按照SUBDIRS的顺序。。
运行automake -a命令,在三个文件下面均生成Makefile.in文件
运行./configure --prefix=·pwd·命令,生成Makefile文件
运行make,make install(第一次运行的时候好像是需要现在fun目录下面运行一下make,然后再在根目录下面运行make)
这时候在fun和src目录下就生成了相应的动态链接库和可执行程序了。