C 不带“的挡泥板;“出口”;

C 不带“的挡泥板;“出口”;,c,bash,shell,gcc,C,Bash,Shell,Gcc,是否可以在C程序中设置变量MUDFLAP_选项,而不必从bash导出它 myuser@linux:~$ export MUDFLAP_OPTIONS="-mode-check -viol-abort -internal-checking -heur-stack-bound -heur-start-end -verbose-violations -crumple-zone=32" myuser@linux:~$ gcc -fmudflap -funwind-tables -lmudflap -rd

是否可以在C程序中设置变量MUDFLAP_选项,而不必从bash导出它

myuser@linux:~$ export MUDFLAP_OPTIONS="-mode-check -viol-abort -internal-checking -heur-stack-bound -heur-start-end -verbose-violations -crumple-zone=32"
myuser@linux:~$ gcc -fmudflap -funwind-tables -lmudflap -rdynamic myprogram.c
我尝试过这个,但不起作用:

static char *var = "MUDFLAP_OPTIONS=-mode-check -viol-abort -internal-checking -heur-stack-bound -heur-start-end -verbose-violations -crumple-zone=32";
putenv(var);

Mudflap可能在调用
main
之前读取选项,因此在它读取选项之前,您没有机会将选项写入环境

为什么不编写一个包装器脚本来设置选项并调用可执行文件呢

#!/bin/sh
export MUDFLAP_OPTIONS="-mode-check -viol-abort -internal-checking -heur-stack-bound -heur-start-end -verbose-violations -crumple-zone=32"
./my-executable

Mudflap可能在调用
main
之前读取选项,因此在它读取选项之前,您没有机会将选项写入环境

为什么不编写一个包装器脚本来设置选项并调用可执行文件呢

#!/bin/sh
export MUDFLAP_OPTIONS="-mode-check -viol-abort -internal-checking -heur-stack-bound -heur-start-end -verbose-violations -crumple-zone=32"
./my-executable

除了要启动的程序外,您不必导出到其他任何程序。像这样:

VARNAME=value ./program
因此,对于您的情况:

MUDFLAP_OPTIONS="-mode-check -viol-abort -internal-checking -heur-stack-bound -heur-start-end -verbose-violations -crumple-zone=32" ./myprogram

除了要启动的程序外,您不必导出到其他任何程序。像这样:

VARNAME=value ./program
因此,对于您的情况:

MUDFLAP_OPTIONS="-mode-check -viol-abort -internal-checking -heur-stack-bound -heur-start-end -verbose-violations -crumple-zone=32" ./myprogram

这就是Makefiles存在的原因。gcc不会为您执行程序,也不会从您的代码中获取任何环境变量。相反,您需要在Makefile中设置此类内容,如下所示:

export MUDFLAP_OPTIONS="-mode-check -viol-abort -internal-checking -heur-stack-bound -heur-start-end -verbose-violations -crumple-zone=32"

all:
    gcc -fmudflap -funwind-tables -lmudflap -rdynamic myprogram.c

将其保存为
Makefile
,只需键入
make
即可编译程序。您再也不需要记得导出该变量了。

这就是Makefiles存在的原因。gcc不会为您执行程序,也不会从您的代码中获取任何环境变量。相反,您需要在Makefile中设置此类内容,如下所示:

export MUDFLAP_OPTIONS="-mode-check -viol-abort -internal-checking -heur-stack-bound -heur-start-end -verbose-violations -crumple-zone=32"

all:
    gcc -fmudflap -funwind-tables -lmudflap -rdynamic myprogram.c

将其保存为
Makefile
,只需键入
make
即可编译程序。您再也不需要记得导出该变量了。

您可以向make文件中添加与Mudflap相关的附加标志,如下所示

MUDFLAP_OPTIONS+=-fmudflap -fmudflapth -funwind-tables 
然后将其与-lmudflapth-rdynamic链接,如下所示

LDFLAGS+=-lmudflapth -rdynamic
注意:只有当您的代码是多线程代码时,才需要标记“-fmudflapth”。如果不是,您可以避免该标志,并在链接时使用“-lmudflap”而不是“-lmudflapth”


对于挡泥板帮助,请使用
mudflap\u OPTIONS=“-help”。/myexecutablefile

您可以将挡泥板相关的附加标志添加到make文件中,如下所示

MUDFLAP_OPTIONS+=-fmudflap -fmudflapth -funwind-tables 
然后将其与-lmudflapth-rdynamic链接,如下所示

LDFLAGS+=-lmudflapth -rdynamic
注意:只有当您的代码是多线程代码时,才需要标记“-fmudflapth”。如果不是,您可以避免该标志,并在链接时使用“-lmudflap”而不是“-lmudflapth”


对于挡泥板帮助,请使用
mudflap\u OPTIONS=“-help”。/myexecutablefile

这是错误的。Mudflap被编译到您的程序中,然后当您的程序运行时,它会检查
Mudflap\u OPTIONS
环境变量以确定其运行时设置。因此,您需要在运行程序时设置环境变量,而不是在编译程序时。GNU make文件中不需要导出。另外,我认为使用
CFLAGS
CC
选择
gcc
传递标志是更好的方法,使用隐式规则。(
all:myprogram
myprogram:myprogram.c
无需任何额外命令)。对于make文件的使用,仍然是+1:)@Brian Campbell:不过,从问题中根本看不出这一点。在问题
myprogram
中甚至没有执行:)@STATUS\u ACCESS\u DENIED这就是为什么我在回答之前查找了Mudflap的用法;我打算发布关于使用Makefile的答案,但决定检查文档,发现它实际上是在运行时读取环境变量,而不是在编译时(无论如何,读取环境变量的时间都很奇怪)。@Brian:在我看来,在编译时读取环境变量并不奇怪。毕竟,
gcc
执行其他的“后端工作”。所以通过环境变量来控制是有意义的。这是错误的。Mudflap被编译到您的程序中,然后当您的程序运行时,它会检查
Mudflap\u OPTIONS
环境变量以确定其运行时设置。因此,您需要在运行程序时设置环境变量,而不是在编译程序时。GNU make文件中不需要导出。另外,我认为使用
CFLAGS
CC
选择
gcc
传递标志是更好的方法,使用隐式规则。(
all:myprogram
myprogram:myprogram.c
无需任何额外命令)。对于make文件的使用,仍然是+1:)@Brian Campbell:不过,从问题中根本看不出这一点。在问题
myprogram
中甚至没有执行:)@STATUS\u ACCESS\u DENIED这就是为什么我在回答之前查找了Mudflap的用法;我打算发布关于使用Makefile的答案,但决定检查文档,发现它实际上是在运行时读取环境变量,而不是在编译时(无论如何,读取环境变量的时间都很奇怪)。@Brian:在我看来,在编译时读取环境变量并不奇怪。毕竟,
gcc
执行其他的“后端工作”。所以通过环境变量来控制是有意义的;原文实际上是正确的,虽然我不确定把两行压缩成一行,你需要一直重复,这有多大帮助。当Mudflap编译到您的程序中时,它将在运行时检查环境变量以确定其选项;它在编译时不受控制。@Brian:看到你对另一个答案的评论了。回复。谢谢你指出:)你的编辑错了;原文实际上是正确的,虽然我不确定把两行压缩成一行,你需要一直重复,这有多大帮助。当Mudflap编译到您的程序中时,它将在运行时检查环境变量以确定其选项;它在编译时不受控制。@Brian:看到你对另一个答案的评论了。回复。谢谢你指出:)