【发布时间】:2018-10-05 14:56:39
【问题描述】:
第一次披露:我不是一个 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”
有人可以帮我看看我应该在我的系统和/或环境变量中寻找什么来解决这个错误吗?
【问题讨论】:
-
相关:在 iOS 上我遇到了同样的问题:
putenv未找到。 -
@Jean-FrançoisFabre:那是因为 iOS 基于 BSD。 BSD 函数是
setenv,putenv是 SVR4 的等价物。这是历史性的。 -
啊,也可能是一个有趣的问答:)