7

第一次披露:我不是一个 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 = %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”

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

4

3 回答 3

6

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

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

另请参见IRIX putenv() 联机帮助页。寻找setenv()那里没有显示任何命中,所以我假设,这个功能缺失(注意:IRIX 6.5.30 来自 2006)

于 2018-10-05T15:11:57.923 回答
0

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

setenv("CCX_JOBNAME_GETJOBNAME",jobnamec,1)

在我原来的主 C 程序中

putenv("CCX_JOBNAME_GETJOBNAME=jobnamec")

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

于 2018-10-05T19:27:37.950 回答
0

过去,设置或更改环境变量一直存在问题。对于环境块有一个固定的内存区域,已经使用了各种解决方案。这些包括链接内存片段和使用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.

于 2018-10-05T16:02:14.227 回答