automake生成库

最近改一个项目,项目使用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目录下就生成了相应的动态链接库和可执行程序了。
 

你可能感兴趣的:(linux系统编程)