automake动态库

来源:互联网 发布:御坂网络ssr 编辑:程序博客网 时间:2024/05/16 18:19

AUTOMAKE_OPTIONS=foreign

INCLUDES=-I$(top_srcdir)/libpr/include -I$(top_srcdir)/vt/include

noinst_PROGRAMS =libvt.so
libvt_so_SOURCES=vty/vtcmd.c vty/vtdrv.c vty/vty.c vty/evtd.c telnet/telcmd.c telnet/teldrv.c telnet/telnegot.c telnet/telsvr.c telnet/telsess.c vty/defcmd.c vty/vtobj.c
libvt_so_LDFLAGS = -fPIC -shared
libvt_so_LDADD=$(top_srcdir)/libpr/libpr.a

bin_PROGRAMS = test_telnetd
test_telnetd_SOURCES = test/test_telnetd.c 
test_telnetd_LDADD=$(top_srcdir)/libpr/libpr.a libvt.so

 

上面这段代码是从我的一个工程的Makefile.am中摘抄过来的,使用不少技巧。

1、动态库实际上也是ELF格式,所以我们使用PROGRAMS宏,automake将他按执行文件规格设置环境,如果使用noinstall_LIBRARIES那么就变成*.a静态库了。

2、因为是动态库,所以我们有必要加入-fPIC -shared

3、test_telnetd需要调用libvt.so,所以他们之间存在依赖关系。我们将libvt.so直接添加在LDADD中,automake会自动他们建立依赖关系,在Makefile中可以到test_telnetd_DEPENDENCIES,里面包含libvt.so。

 

这里有几个要紧需要注意:

1、$(bin_PROGRAMS)编译顺序在$(noinstall_PROGRAMS)之前,因为test_telnetd需要libvt.so,所以会找不到libvt.so。

2、在LDADD中如果使用-lvt不会建立依赖关系,如果使用$(top_srcdir)/vt/libvt.so也不行。

3、实际上如果不行的话,我们可以直接使用test_telnetd_DEPENDENCIES来指定libvt.so

4、如果需要make install 安装libvt.so到lib,那么使用XXX_PROGRAMS=...的方法,然后指定XXXbin=...就行了。类似于bin_PROGRAMS。

 

这里使用到的技巧都很有用,值得记录下来。