automake编写完整的项目---动态库+可执行文件

上一篇博客automake简介中简单的介绍了automake的使用流程,但是真正的项目肯定是很复杂的,包含不同的目录,有的生成动态库,有的是可执行文件,本文就用一个简单的opencv项目来介绍一下automake在大型项目的使用方法。本文中,最外层包含两个目录,一个目录是src,里面是不同模块的源文件,最后是要生成动态库的;一个目录是sample,里面是一个应用程序,调用src中的动态库生成可执行文件,而src中又包含了不同的目录,每个子目录最后生成一的so动态库,具体如下:其中,smooth、sharpen、segment分别生成三个动态库,而processManage则调用他们三个也生成一个动态库,最后sample中的main函数调用processManage提供的接口间接的调用smooth、sharpen、segment三个动态库实现一个应用程序:


具体步骤如下:

1、在最外层目录(和src、sample在同一级)执行autoscan命令生成autoscan.log和configure.scan文件

2、mv configure.scan configure.ac且修改configure.ac(早期使用configure.in)

[plain]  view plain  copy
  1. #                                               -*- Autoconf -*-  
  2. # Process this file with autoconf to produce a configure script.  
  3.   
  4. AC_PREREQ([2.68])  
  5. AC_INIT(segment, 1.0, email)              
  6. AM_INIT_AUTOMAKE(segment,1.0)    #手动添加  
  7. AC_CONFIG_SRCDIR([sample/segment.cpp])  #用于检测源码目录的有效性,任选一个源码文件即可  
  8. AC_CONFIG_HEADERS([config.h])  
  9.   
  10. # Checks for programs.  
  11. AC_PROG_CXX  
  12. AC_PROG_CC  
  13.   
  14. # Checks for libraries.  
  15. # Checks for header files.  
  16. # Checks for typedefs, structures, and compiler characteristics.  
  17. # Checks for library functions.  
  18.   
  19. AC_CONFIG_FILES([Makefile src/Makefile src/smooth/Makefile src/sharpen/Makefile src/segment/Makefile src/processManage/Makefile sample/Makefile])   #需要生成的所有Makefile    
  20. AC_OUTPUT  

3、使用aclocal生成aclocal.m4文件

4、执行autoconf命令生成configure文件

5、执行autoheader命令生成config.h和config.h.in 

6、在每一个需要生成Makefile的目录里创建Makefile.am文件

6.1:如果是父目录(和src、sample在同一级),则必须包含SUBDIRS = src sample  (注意顺序),相当于调用子目录去生成Makefile,如果没有其它的操作,则只有这一行即可.同理,src中的(和smooth、sharpen、segment、processManage同一级的)Makefile.am也只有一行,即SUBDIRS = smooth sharpen segment processManage。对于smooth、sharpen和segment三个目录中Makefile.am分别生成一个动态库,方法类似,这里给出smooth目录中的Makefile.am:

[plain]  view plain  copy
  1. INCLUDES = `pkg-config opencv --cflags` -I./   #头文件的目录  
  2. projectlibdir=$(libdir)  
  3. projectlib_PROGRAMS = libsmooth.so    #动态库的名字  
  4. libsmooth_so_SOURCES = GaussSmooth.cpp MedianSmooth.cpp GaussSmooth.h Smooth.h  
  5. libsmooth_so_LDFLAGS = -shared -fpic #GCC编译动态库的选项  
上面宏的具体含义,参考上一篇博客的表格

对于processManage中的Makefile.am,由于调用了另外三个so,所以稍微有点不同,具体如下:

[plain]  view plain  copy
  1. INCLUDES = `pkg-config opencv --cflags` -I../smooth/ -I../sharpen -I../segment/ -I./  
  2. projectlibdir = $(libdir)  
  3. projectlib_PROGRAMS = libmanage.so  
  4. libmanage_so_SOURCES = processManage.cpp  processManage.h  
  5. libmanage_so_LDFLAGS = -shared -fpic #GCC编译动态库的选项  
  6. libmanage_so_LDADD= -L../smooth/ -L../sharpen/ -L../segment/ -lsmooth -lsharpen -lsegment  #依赖的库  
最后是sample中可执行文件的Makefile.am,具体如下:

[plain]  view plain  copy
  1. AUTOMAKE_OPTIONS = foreign  
  2. INCLUDES=`pkg-config opencv --cflags` -I../src/processManage/ -I../src/smooth/ -I../src/sharpen/ -I../src/segment/ -I.   
  3. bin_PROGRAMS = segment  
  4. segment_SOURCES = segment.cpp  
  5. LIBS = `pkg-config opencv --libs`   
  6. segment_LDADD =-L../src/smooth/ -L../src/sharpen/ -L../src/segment/ -L../src/processManage/  -lsmooth -lsharpen -lsegment -lmanage     
注意事项:由于GCC中依赖的动态库必须放在-o参数的后面,所以`pkg-config opencv --libs`必须放到LIBS变量中,因为查看后面生成的Makefile可以看到,_LDADD和_LIBS在-o的后面,而_LDFLAGS在-o的前面,而 `pkg-config opencv --libs`不能放到_LDADD中
6.2: 如果使用libtool生成动态库,可以使用libtool生成可移植性的动态库,生成的动态库为.lo文件,它会调用自己目录下子目录./libs/中的.so文件,使用.lo文件和使用.so文件的方法类似,只是需要使用-lz参数,模版如下(下面用一个简单的项目举例):

[plain]  view plain  copy
  1. AUTOMAKE_OPTIONS=foreign  
  2. lib_LTLIBRARIES=libhello.la   #要生成的动态库的名字  
  3. libhello_la_SOURCES=test.cpp #依靠的源文件和头文件,使用空格分开  
此时的可执行文件,模版如下:

[plain]  view plain  copy
  1. AUTOMAKE_OPTIONS=foreign  
  2. INCLUDES= -I../include     #依赖的头文件目录  
  3. bin_PROGRAMS=hello      
  4. hello_SOURCES=hello.cpp  
  5. hello_LDADD= -L../lib/ -lz ../lib/test.lo  #依赖的库文件  
7、如果要生成.lo动态库,则 libtoolize --automake --copy --force

8、touch NEWS README AUTHORS ChangeLog

9、执行automake --add-missing命令生成Makefile.in文件

10、执行./configure 命令生成Makefile文件

11、执行make && make install

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值