如何更改 VAR 名称而不在 'make install' 之后出现未声明的错误?

How to change VAR name without getting the undeclared error after 'make install'?

我的 configure.in 文件有:

VAR=yo
AC_SUBST(VAR)

Makefile.am 有:

bin_PROGRAMS = hello
hello_SOURCES = hello.c 
hello_CFLAGS =-DVAR=@VAR@

C 文件是:

#include <stdio.h>
int main()
{
    printf("%s\n",VAR);
    return 0;
}

当我执行 'make install' 时出现错误

Making install in src
make[1]: Entering directory `/home/albertpod/hello/src'
if gcc -DPACKAGE_NAME=\"hello\" -DPACKAGE_TARNAME=\"hello\" -DPACKAGE_VERSION=\"1.0\" -DPACKAGE_STRING=\"hello\ 1.0\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"hello\" -DVERSION=\"1.0\" -I. -I.    -DVAR=yo -g -O2 -MT hello-hello.o -MD -MP -MF ".deps/hello-hello.Tpo" -c -o hello-hello.o `test -f 'hello.c' || echo './'`hello.c; \
    then mv -f ".deps/hello-hello.Tpo" ".deps/hello-hello.Po"; else rm -f ".deps/hello-hello.Tpo"; exit 1; fi
hello.c: In function ‘main’:
hello.c:8:13: error: ‘yo’ undeclared (first use in this function)
hello.c:8:13: note: each undeclared identifier is reported only once for each function it appears in
make[1]: *** [hello-hello.o] Error 1
make[1]: Leaving directory `/home/albertpod/hello/src'
make: *** [install-recursive] Error 1

所以VAR的名字变成了yo,但是没有声明。我的目标是打印哟,但是如何解决这个问题?

我假设您希望程序提供输出

yo

configure.in

中的正确引用

您可能还注意到您缺少引号,以使定义 VAR 的替换文本成为字符串文字。困难在于,您要通过将去除引号的 shell 的两个实例传递此值:执行 configure 的实例和由 make 调用到 [=73= 的实例] 编译器。所以你需要三层引用,并进行适当的转义:

VAR="\"\\"yo\\"\""
AC_SUBST(VAR)

(你可以尝试在里面用单引号来减少\的数量,但它可能会变得更难看。)

Makefile.am

中的正确引用

您也可以在 Makefile.am 中引用。如果您还需要 Makefile 中的 VAR 值用于其他目的,这将特别有用。您需要两个级别的 qoutes,一个使值成为字符串文字,另一个被 shell:

吃掉
hello_CFLAGS =-DVAR='"@VAR@"'

即使 VAR 包含(单个)空格或其他有趣的字符,这仍然有效,唯一有问题的字符是 '"\

字符串化

或者,您可以让预处理器使用字符串化运算符添加引号 #:

#include <stdio.h>

#define STR2(arg) #arg
#define STR(arg) STR2(arg)

int main()
{
    printf("%s\n",STR(VAR));
    return 0;
}

由于 # 运算符的工作方式有一个怪癖,因此宏中的间接寻址是必要的。如果您只使用一级宏,则输出将是 VAR.

当然,这只有在值不包含任何有趣的字符(如空格)时才有效。

使用AC_DEFINE

使用 AC_DEFINE 时,将 VAR 定义为用引号括起来的值会稍微容易一些。使用

AC_DEFINE([VAR], ["yo"])

configure.in 中并从 Makefile.am 中删除 hello_CFLAGS =-DVAR=@VAR@。或者,如果您需要计算 configureVAR 的值,请使用

VAR=yo
AC_DEFINE_UNQUOTED([VAR], ["$VAR"])

这将解释值中的 shell 个替换。

在这两种情况下,您都无法访问 Makefile 中的 VAR