Automake构建顺序问题:如何先编译共享库再编译测试程序?
解决Makefile.am中先构建共享库再构建测试程序的问题
Automake 的目标构建顺序不依赖变量定义的先后,而是由显式的依赖关系控制。要让测试程序等待共享库构建完成后再编译,你可以通过以下两种方式处理:
方式一:为测试程序添加库依赖(推荐)
如果测试程序需要链接整个共享库,显式声明测试程序对库目标的依赖,并在链接选项中指定该库:
# 定义共享库 lib_LTLIBRARIES = libfoo.la libfoo_la_SOURCES = foo.c foo.h # 定义测试程序 bin_PROGRAMS = test_foo test_foo_SOURCES = test_foo.c # 链接时使用共享库 test_foo_LDADD = libfoo.la # 显式声明依赖:必须先构建libfoo.la才能构建test_foo test_foo_DEPENDENCIES = libfoo.la
这样 Automake 会自动识别依赖关系,强制先完成libfoo.la的构建,再编译链接test_foo。
方式二:直接依赖库的单个.o文件
如果测试程序仅需要使用库中的某个.o文件,可以直接将该目标文件加入测试程序的依赖,并在编译时引用:
# 定义共享库 lib_LTLIBRARIES = libfoo.la libfoo_la_SOURCES = foo.c foo.h # 定义测试程序 bin_PROGRAMS = test_foo test_foo_SOURCES = test_foo.c # 显式依赖库的.o文件 test_foo_DEPENDENCIES = foo.o # 编译时链接该.o文件 test_foo_LDADD = foo.o
注意:这种方式仅适用于简单场景,若库包含多个.o文件或使用 libtool 的特殊编译选项,推荐使用方式一,避免链接缺失或编译选项不一致的问题。
额外注意点
- 如果测试程序属于单元测试(而非可执行程序),可以使用
check_PROGRAMS替代bin_PROGRAMS,依赖规则完全相同。 - 若库和测试程序在不同子目录,需通过
SUBDIRS变量先声明库所在的子目录,再声明测试程序的子目录,递归构建时会按顺序处理。
内容的提问来源于stack exchange,提问作者Chris Moller
相关产品推荐
相关产品推荐

