C++ 将目录传递给C++;来自编译器的应用程序
某些应用程序包含由驻留在/usr/libexec中的主应用程序运行的脚本。但是,autoconf脚本可以通过将C++ 将目录传递给C++;来自编译器的应用程序,c++,directory,autotools,C++,Directory,Autotools,某些应用程序包含由驻留在/usr/libexec中的主应用程序运行的脚本。但是,autoconf脚本可以通过将--libexecdir传递到配置脚本来更改该目录 例如,在git源代码中运行/configure时,我可以将--libexecdir设置到我想要的任何目录,程序仍然可以工作 我需要添加什么C++来实现这个功能?换句话说,我怎样才能有一个由配置脚本编译到程序中的目录名?,您需要C++代码的值< @ LbExcRedir@ < /Cord>替换变量(如在代码> > MaMeCuff.in
--libexecdir
传递到配置脚本来更改该目录
例如,在git
源代码中运行/configure
时,我可以将--libexecdir
设置到我想要的任何目录,程序仍然可以工作
<>我需要添加什么C++来实现这个功能?换句话说,我怎样才能有一个由配置脚本编译到程序中的目录名?,您需要C++代码的值< <代码> @ LbExcRedir@ < /Cord>替换变量(如在代码> > MaMeCuff.in <代码>中使用)。要做到这一点,最简单、最可靠的方法是在目标文件的编译器命令行上使用
-D
开关,该文件需要知道:
foo.o: CPPFLAGS += -DLIBEXECDIR='"$(libexecdir)"'
在foo.cc
中,LIBEXECDIR
将是一个预处理器宏,扩展为具有所需路径的字符串常量。不过有两个警告:上面的Makefile片段使用了GNU make特性。它在其他Make实现中不起作用。另外,我没有在$(libexecdir)
的扩展中引用任何字符。完全防御性的报价应该是这样的:
foo.o: CPPFLAGS += \
-DLIBEXECDIR='"$(subst ",\",$(subst ','\'',$(subst \,\\,$(libexecdir))))"'
如果您希望能够使用Windows路径名,并且斜杠走错了方向,那么您肯定需要至少最里面的$(subst…
构造。人们通常不会在路径名中加上“或”,所以在有人抱怨之前,我可能不会去管外面的两个
同样的技术也适用于任何不是AC\u DEFINE
的@替代变量
您可能认为您可以使用AC\u DEFINE\u 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\u DEFINE\u UNQUOTED
做一件显而易见的事情,您将得到如下结果
#define LIBEXECDIR "${exec_prefix}/libexec"
在你的config.h.中,这是行不通的,我看不到一个好的方法来让它工作