如何让#define PACKAGE_VERSION不生成在config.h中,避免Autotools项目全量重建?
这个问题我太熟悉了——频繁改版本导致全量重建确实烦,尤其是大部分代码根本不需要版本信息的时候。我来给你一步步解决:
步骤1:在configure.ac中生成独立的版本头文件
首先要把版本相关的宏从默认的config.h里剥离出来,生成单独的version.h:
- 保留你的
AC_INIT([your-package], [1.2.3]),但接下来调整头文件生成逻辑。 - 如果你还需要默认的
config.h,用AC_CONFIG_HEADERS同时指定两个头文件:AC_CONFIG_HEADERS([config.h version.h]) - 为了让版本宏只出现在
version.h里,我们可以用AH_EXCLUDE把它们从config.h中排除,再用AC_DEFINE_UNQUOTED指定这些宏只写入version.h:
这样Autoconf会自动把这些版本宏写入# 在AC_CONFIG_HEADERS之后添加 AH_EXCLUDE([PACKAGE_VERSION]) AH_EXCLUDE([PACKAGE_STRING]) AH_EXCLUDE([PACKAGE_NAME]) AC_DEFINE_UNQUOTED(PACKAGE_VERSION, "$PACKAGE_VERSION", [Package version], [version.h]) AC_DEFINE_UNQUOTED(PACKAGE_STRING, "$PACKAGE_STRING", [Package name and version], [version.h]) AC_DEFINE_UNQUOTED(PACKAGE_NAME, "$PACKAGE_NAME", [Package name], [version.h])version.h,而不会出现在config.h里。
步骤2:调整源文件的头文件引用
- 找到那个需要版本信息的源文件(比如
src/version.c或src/main.c),让它单独包含version.h——如果它还需要config.h的其他宏,就同时包含两个:#include "config.h" #include "version.h" - 其他所有源文件,只保留
#include "config.h",绝对不要包含version.h。
步骤3:修改Makefile.am确保依赖正确
- 把
version.h加入BUILT_SOURCES,确保它在编译前被生成,同时添加到CLEANFILES方便清理:BUILT_SOURCES = version.h CLEANFILES = version.h - 额外,可以给需要版本头文件的源文件明确加上依赖,避免遗漏:
src_main_SOURCES = src/main.c src_main.c: version.h
测试验证
改一下AC_INIT里的版本号,运行./configure后执行make——你会发现只有包含version.h的那个源文件被重新编译,其他文件因为依赖的config.h没有变化,完全不会动,完美解决全量重建的问题!
内容的提问来源于stack exchange,提问作者basin
相关产品推荐
相关产品推荐

