Chinaunix首页 | 论坛 | 博客
  • 博客访问: 270833
  • 博文数量: 86
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 398
  • 用 户 组: 普通用户
  • 注册时间: 2014-09-27 15:56
文章存档

2017年(3)

2015年(21)

2014年(62)

我的朋友

分类: LINUX

2015-06-30 23:02:23

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

automake编写完整的项目---动态库+可执行文件
2014-11-26      0 收藏    我要投稿

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

\


 

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:

 

上面宏的具体含义,参考上一篇博客的表格

 

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

 

最后是sample中可执行文件的Makefile.am,具体如下:

 

 

注意事项:由于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参数,模版如下(下面用一个简单的项目举例):

 

 

此时的可执行文件,模版如下:

 

 

阅读(1776) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~