gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:17:45 24 4
gpt4 key购买 nike

我的 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 调用以运行编译器。因此,您需要三级引用,并进行适当的转义:

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

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

Makefile.am中正确引用

您还可以在 Makefile.am 中进行引用。如果您还需要 Makefile 中的 VAR 值用于其他目的,这尤其有用。您需要两级 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

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

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

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

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

它将解释值中的 shell 替换。

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

关于c - 如何更改 VAR 名称而不在 'make install' 之后出现未声明的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31996178/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com