Autotools构建中make未检测预处理器指令变更的解决咨询
解决方案:让编译目标依赖于Makefile或使用模式规则
当Autotools生成的Makefile中编译标志变更但源文件未修改时,Make默认不会重新编译——因为它只追踪源文件和目标文件的时间戳。以下是几种规范的解决方式:
1. 全局模式规则(通用高效)
在Makefile.am中添加模式规则,让所有目标文件都依赖于当前Makefile。这样只要Makefile因configure修改编译标志而更新,所有相关目标都会触发重新编译:
# 让所有平台的目标文件(如.o/.obj)依赖于Makefile %$(OBJEXT): Makefile
2. 针对特定目标添加依赖
如果只需要让某几个程序/库生效,可以直接给目标的依赖列表添加Makefile:
bin_PROGRAMS = my_app my_app_SOURCES = src/main.c src/mpi_utils.c # 让my_app的编译目标依赖于Makefile my_app_DEPENDENCIES = Makefile
3. 配合自动依赖跟踪增强效果
确保configure.ac中启用了自动依赖生成(Autotools默认通常已开启),让依赖跟踪更完善:
AC_PROG_CC AM_PROG_CC_C_O # 生成.c对应.o的单独规则,提升依赖准确性
原理说明
当你重新运行configure修改--enable-mpi选项时,生成的Makefile时间戳会更新。通过让目标文件依赖于Makefile,Make会检测到这个变化,从而触发重新编译,确保新的编译标志(-DMPI_LIB=0)被应用。
注:不推荐使用
FORCE目标强制编译,这种方式会导致每次make都全量重编,效率极低。
内容的提问来源于stack exchange,提问作者naffrancois
相关产品推荐
相关产品推荐

