Automake库依赖优化:如何让主程序无需直接链接间接依赖库?
解决方案:完全可以实现
只需要调整库的封装方式和lib目录的Makefile.am配置,就能让src目录的编译配置完全不用关心lib_dep的存在。具体步骤如下:
1. 修正lib目录的Makefile.am配置
把lib/Makefile.am里的错误路径修正,并确保库依赖被正确记录:
lib_LTLIBRARIES = lib_lib.la # 动态库源文件 lib_lib_la_SOURCES = library1.c library1.h # 链接依赖的lib_dep库,libtool会自动记录这个依赖关系 lib_lib_la_LIBADD = $(top_builddir)/lib_dep/lib_libdep.la # 编译lib时需要找到lib_dep的头文件,这里是目录路径(之前写的是具体头文件,是错误的) lib_lib_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir)/lib_dep
2. 优化库的封装(关键)
确保lib/library1.h(对外暴露的头文件)不包含lib_dep的头文件,把对lib_dep的依赖完全封装在library1.c内部:
- 在
library1.c里添加#include "library1_dep.h",用来调用lib_dep的函数 library1.h只声明给src调用的公共接口,比如:
#ifndef LIBRARY1_H #define LIBRARY1_H void public_function_from_lib1(void); #endif
这样src编译时只需要识别library1.h,完全不需要知道lib_dep的存在。
3. 简化src目录的Makefile.am
现在src只需要链接lib库,编译时只需要找到lib的头文件即可:
bin_PROGRAMS = main main_SOURCES = main.c # 只需要链接lib库,libtool会自动处理它依赖的lib_dep main_LDADD = $(top_builddir)/lib/lib_lib.la # 编译时只需要找到lib的头文件路径 main_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir)/lib
原理说明
- libtool生成的
.la文件会记录库的依赖关系,当src链接lib_lib.la时,会自动递归链接它依赖的lib_libdep.la,不需要手动添加 - 通过封装,把lib_dep的实现细节隐藏在lib内部,src只需要和lib的公共接口交互,不需要关心其底层依赖
内容的提问来源于stack exchange,提问作者GreenK
相关产品推荐
相关产品推荐

