0

我的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,但未声明。我的目标是打印哟,但是如何解决这种情况呢?

4

1 回答 1

1

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

yo

正确引用configure.in

您可能还注意到您缺少引号,以使定义的替换文本VAR成为字符串文字。困难在于您要通过两个将去掉引号的 shell 实例传递此值:一个执行configure,另一个调用make以运行编译器。因此,您需要三个级别的引用,并进行适当的转义:

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

(您可以尝试在其中使用单引号来减少 的数量\,但它可能会变得更加丑陋。)

正确引用Makefile.am

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

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

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

串化

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

#include <stdio.h>

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

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

由于操作符的工作方式有一个怪癖,宏中的间接性是必要的#。如果您只使用一级宏,则输出为VAR.

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

使用AC_DEFINE

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

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

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

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

这将解释值中的外壳替换。

在这两种情况下,您都无权访问VARMakefile。

于 2015-08-18T17:46:52.570 回答