如何通过AC_CONFIG_SUBDIRS将Project B的AC_DEFINE宏导出至Project A?
解决方案
AC_CONFIG_SUBDIRS仅负责递归配置子项目,子项目中用AC_DEFINE定义的宏默认不会自动传递给主项目,需通过以下方式手动实现宏的共享:
方法一:直接引用子项目配置头文件
- 修改Project B的
configure.ac,添加生成配置头文件的指令,让宏定义写入该文件:AC_DEFINE([NEWDEFINE]) AC_CONFIG_HEADERS([projectb_config.h]) # 新增:生成包含宏定义的头文件 - 重新生成Project B的配置文件:
cd projectb && autoreconf -i && cd .. - 在Project A的
a.c中,引入子项目的配置头文件:#include "projectb/projectb_config.h" #ifndef NEWDEFINE #error NEWDEFINE not defined #endif - 在Project A的编译配置中添加子项目头文件路径:
- 若用Automake,修改
Makefile.am:AM_CPPFLAGS = -Iprojectb - 或直接在
configure.ac中设置:CPPFLAGS="$CPPFLAGS -Iprojectb"
- 若用Automake,修改
方法二:提取子项目宏定义到主项目
- 按方法一第一步修改Project B的
configure.ac,确保宏定义写入配置头文件。 - 在Project A的
configure.ac中,递归配置子项目后读取其配置头文件,提取宏定义并添加到主项目:AC_CONFIG_SUBDIRS([projectb]) # 读取子项目配置头文件,提取NEWDEFINE if test -f projectb/projectb_config.h; then if grep -q '^#define NEWDEFINE' projectb/projectb_config.h; then AC_DEFINE([NEWDEFINE], [], [Imported from Project B]) fi fi # 确保主项目生成自身配置头文件 AC_CONFIG_HEADERS([config.h]) - 在Project A的
a.c中引入主项目配置头文件:#include "config.h" #ifndef NEWDEFINE #error NEWDEFINE not defined #endif
验证构建
执行以下命令重新构建项目:
autoreconf -i ./configure make
内容的提问来源于stack exchange,提问作者Fabio Porcedda
相关产品推荐
相关产品推荐

