如何使用C中的setenv避免此错误?

时间:2018-10-05 14:56:39

标签: c gcc posix irix

第一次公开:我不是C程序员。我正在尝试使用Makefile生成用于工程计算的可执行文件,以非常多的谱系编译一组C和Fortran代码。我在sgi Irix(6.5.30)上使用gcc 4.7.1。在主程序的编译过程中,首先我得到关于“函数'setenv'的隐式声明”的警告。随后,在生成所有目标“ o”文件之后,编译以错误结束:

  

ld32:错误33:无法解析的数据符号“ setenv”

注释定义了“ setenv”的一行,可以使编译成功并生成可执行文件。但是setenv所在的行对程序至关重要。

这导致我编写了测试代码并确认了相同的问题:

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
int main()
{
   setenv("FILE","/usr/bin/example.c",50);
   printf("File = %s\n", getenv("FILE"));
   return 0;
}

根据我在堆栈交换和其他站点上进行谷歌搜索时发现的所有建议,我尝试包括不同的标头,例如

#define _POSIX_C_SOURCE

#define _GNU_SOURCE

在任何#define语句之前。我也尝试使用-std=c99以及-D_XOPEN_SOURCE-D_GNU_SOURCE进行编译,但是没有运气。

我也尝试使用Irix的本机C编译器(cc和c99)编译测试程序,但出现相同的错误:

  

无法解析的文字符号“ setenv”

有人可以帮助我解决系统错误或环境变量中的问题吗?

3 个答案:

答案 0 :(得分:6)

IRIX libc确实似乎不支持setenv()命令。您必须像这样用putenv()重写它:

putenv("FILE=/usr/bin/example.c");

另请参阅IRIX putenv() manpage。寻找setenv()时未显示任何匹配,因此我认为此功能缺失(注意:IRIX 6.5.30是2006年推出的)

答案 1 :(得分:0)

设置或更改环境变量在过去一直存在问题。对于用于环境块的固定存储区,已使用了各种解决方案。这些包括链接内存片段,并使用realloc(3)。没有标准的方式来更改环境块,即使现在C99专门排除了putenv(3),也没有提到setenv(3)。

POSIX同时包含setenv(3)putenv(3),它们的作用相似。该标准确实指出,setenv(3)是首选功能:

”关于是否应将System V putenv()函数或BSD setenv()函数作为强制性函数存在很多争论。之所以选择setenv()函数是因为它允许实现unsetenv()函数可删除环境变量,而无需指定其他接口。putenv()函数可作为XSI扩展使用。“

都不是线程安全的。

This可能是重复的,尽管它专门提到C99而不是gcc

答案 2 :(得分:0)

感谢大家,我的问题已经解决! 我替换了

setenv("CCX_JOBNAME_GETJOBNAME",jobnamec,1)

在我原来的主C程序中

putenv("CCX_JOBNAME_GETJOBNAME=jobnamec")

我能够编译代码以完成最终的可执行文件。

相关问题