第一次披露:我不太喜欢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")
我能够编译代码以完成创建最终可执行文件。