您需要将 @libexecdir@ 替换变量的值(如 Makefile.in 中使用的)暴露给您的 C++ 代码。最简单、最可靠的方法是在需要知道的目标文件的编译器命令行上使用-D 开关:
foo.o: CPPFLAGS += -DLIBEXECDIR='"$(libexecdir)"'
在foo.cc 中,LIBEXECDIR 将是一个预处理器宏,扩展为具有您需要的路径的字符串常量。但是有两个警告:上面的 Makefile sn-p 使用了 GNU make 功能,target-specific variables。它不适用于其他 Make 实现。另外,我没有费心在$(libexecdir) 的扩展中引用任何字符。完全防御性的引用看起来像这样:
foo.o: CPPFLAGS += \
-DLIBEXECDIR='"$(subst ",\",$(subst ','\'',$(subst \,\\,$(libexecdir))))"'
如果您希望能够使用 Windows 路径名,那么您肯定至少需要最里面的 $(subst ...) 结构,而斜线的方向是错误的。人们通常不会将 ' 或 " 放在路径名中,所以在有人抱怨之前我可能不会打扰外面的两个。
同样的技术适用于任何不是AC_DEFINE 的@whatever@ 替换变量。
您可能认为您可以使用AC_DEFINE_UNQUOTED 以某种方式将$(libexecdir) 的值转换为config.h,从而避免所有这些在命令行中乱七八糟的事情。不幸的是,Autoconf 并没有在配置时完全计算其 @*dir@ 替换的值:
# near the top of the generated 'configure':
exec_prefix=NONE
libexecdir='${exec_prefix}/libexec'
# much, much later -- as part of AC_OUTPUT:
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
因此,如果你用AC_DEFINE_UNQUOTED 做明显的事情,你会得到类似的东西
#define LIBEXECDIR "${exec_prefix}/libexec"
在您的 config.h 中。所以那是行不通的,而且我看不出有什么好办法让它发挥作用。