You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 18:32:40