我正在尝试在 config.h 中为应用程序的安装目录创建全局定义。根据the Autoconf manual ,前缀变量可以用于此目的。在configure.ac中,我创建了一个全局定义:
AC_DEFINE_UNQUOTED([PROGRAM_DIRECTORY], [${prefix}], [])
但是 config.h 是用以下内容创建的:
#define PROGRAM_DIRECTORY NONE
即使我运行配置,我也会得到相同的结果:
./configure --prefix=/usr/local
我还尝试了其他变量,例如bindir。
是否有一个我可以使用的变量可以为我提供信息?还是我以错误的方式处理这个问题?
最佳答案
I am trying to create a global define in config.h for the installation directory of the application.
这有一些潜在的问题,但是好的。
According to the Autoconf manual, the prefix variable can be used for this purpose.
嗯,前缀旨在指定目录树的根,构建的工件安装在各个子目录中。典型的选择是 /usr
之间。和/usr/local
,尽管在某些情况下您可能确实使用其他内容,例如 /opt/my_prog
。如果这与您想要做的一致,那么您应该使用标准 --prefix
每个 Autoconf configure
提供的选项脚本向其传达所需的前缀:
./configure --prefix=/usr/local
当然,/usr/local
是该变量的默认值。如果这确实是您想要的,那么您不需要做任何特殊的事情来将其作为您的前缀。
但是,我建议您不要在 config.h
中创建基于前缀的定义。 。自动工具会遇到一些麻烦,以确保您在 configure
时指定的任何前缀。可以在make
处被覆盖通过指定 prefix
来指定时间至make
:
make prefix=/something/else
如果执行了该操作,则实际安装目录将与 config.h
中给出的目录不同。 。因此,我建议通过 -D
指定适当的定义。适当的选项 foo_CPPFLAGS
Automake 变量,或者如果您使用 Autoconf
则通过等效方式没有Automake
。例如:
foo_CPPFLAGS = $(AM_CPPFLAGS) -DPROGRAM_DIRECTORY='$(prefix)'
这与使用 config.h
并不冲突用于其他目的。 (请注意,引号将由 shell 处理;它们对于 make
并不重要,并且它们不会出现在定义符号的实际值中。)
话虽如此,我无法立即解释您所描述的行为。我最好的猜测是你的 AC_DEFINE_UNQUOTED()
很早就出现在您的 configure.ac
中它在命令行处理之前生效。这样的话,下移或许就足以达到预期的效果了。
关于autotools - 如何使用autoconf创建安装目录变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48693343/