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

  • 本文关键字:错误 setenv c gcc posix irix
  • 更新时间 :
  • 英文 :


第一次披露:我不太喜欢C程序员。 我正在尝试编译一组具有很多血统的 C 和 Fortran 代码,使用 Makefile 生成用于工程计算的可执行文件。 我在 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 = %sn", 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">

有人可以提供帮助,说明我应该在我的系统和/或环境变量中寻找什么来解决此错误吗?

看起来 IRIX libc 确实不支持setenv()命令。您将不得不像这样用putenv()重写它:

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

另请参阅 IRIX putenv(( 手册页。寻找setenv()没有显示任何命中,所以我假设,这个函数丢失了(注意:IRIX 6.5.30 来自 2006 年(

设置或更改环境变量在过去一直存在问题。 由于环境块的固定内存区域,已经使用了各种解决方案。 其中包括链接内存片段和使用realloc(3(。 以前没有改变环境块的标准方法,即使是现在,C99也特别排除了putenv(3(,也没有提到setenv(3(。

POSIX包括setenv(3(和putenv(3(,它们执行类似的工作。 但是,该标准确实指出setenv(3(是首选功能:

"关于是否应该将System V putenv((函数或BSD setenv((函数作为强制函数存在相当大的争论。选择 setenv(( 函数是因为它允许实现 unsetenv(( 函数来删除环境变量,而无需指定额外的接口。putenv(( 函数可作为 XSI 扩展使用。

两者都不是线程安全的。

这可能是重复的,尽管它特别提到了 C99 而不是gcc.

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

setenv("CCX_JOBNAME_GETJOBNAME",jobnamec,1)

在我的原始主 C 程序中 跟

putenv("CCX_JOBNAME_GETJOBNAME=jobnamec")

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

相关内容

  • 没有找到相关文章

最新更新