C 未定义对'的引用;环境';?

C 未定义对'的引用;环境';?,c,C,我试图使用'environ'变量,但它总是给我一个错误。这似乎是一个makefile/build错误,我似乎无法修复它。我寻找了很多答案,但还是迷路了 这是我的c文件: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <dirent.h> #include "cmd.h" int cmdExec() { ... extern char **environ;

我试图使用'environ'变量,但它总是给我一个错误。这似乎是一个makefile/build错误,我似乎无法修复它。我寻找了很多答案,但还是迷路了

这是我的c文件:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include "cmd.h" 

int cmdExec() {
...
extern char **environ;
...


printf("Enter a command\n");
//gets (input);
scanf("%s%*[^\n]", input);

if (...) {
    ...
}
else if (strcmp(input, "environ") == 0) {
    int i;
    for (i = 0; environ[i] != NULL; i++) {
        printf("%s\n", environ[i]);
    }
    exit(0);
else
    ...

return 0;
}
这是输出:

make all 
gcc -c -std=c99 cmd.c
gcc   cmd.o   -o cmd
cmd.o:cmd.c:(.text+0x105): undefined reference to `environ'
cmd.o:cmd.c:(.text+0x127): undefined reference to `environ'
collect2: ld returned 1 exit status
make: *** [cmd] Error 1
从我搜索的内容来看,这涉及到链接库,但我不知道如何将其应用于我的具体情况。如果有人能帮我一把,我将不胜感激。

并非所有(如果有的话)Windows编译器都能通过名为
environ
的全局符号访问环境变量

您可以使用例如()来访问环境变量

win32 API提供()来访问所有变量

某些平台允许您通过main()的附加参数访问环境,您可以将主函数声明为:

int main(int argc, char *argv[], char *environ[])

environ
全局变量由POSIX定义,Windows不支持它(除非您使用的是Cygwin,它是在Windows上实现的类似POSIX的层)

据我所知,非标准定义

int main(int argc, char **argv, char **envp) { /* ... */ }
Windows上也不支持

但一个快速的谷歌搜索出现了,它指向Windows特定功能的文档:

LPTCH WINAPI GetEnvironmentStrings(void);
如果函数成功,则返回值是指向 当前进程的环境块

如果函数失败,返回值为
NULL

结果指向一个长字符串,其中环境变量由
'\0'
空字符分隔,环境由两个连续的空字符终止


LPTCH
是微软的typedef,用于指向
无符号字符
或16位
wchar\u t
的指针。有关更多信息,请参阅参考文档。

您使用的是什么系统?一个简单的“hello,world”程序编译、链接和执行是否正确?我使用的是Windows7,是的,在我尝试使用“environ”之前,一切都很好。你使用的是什么gcc?西格温?明格?还有什么?
environ
是POSIX标准变量。即使在使用MinGW这样的环境时,它也可能不存在于Windows上。另外,最重要的是“应用程序不应直接访问
environ
数组”。@JoachimPileborg:这是为那些知道需要使用哪些环境变量的程序找到的(并且
getenv()
是标准C,所以它应该在Windows上工作)--那么您将如何实现类似于
printenv
命令的功能呢?Cygwin在Windows上提供了一个类似POSIX的环境。OP可能没有使用Cygwin。@KeithThompson我想我的结论是使用getenv、putenv和setenv(如我的说明中所列)而不是environ。因为我的说明没有明确说明,这些方法足以替代environ吗?在阅读和理解了一些内容之后,我认为这个答案中建议的方法对我个人来说是可行的,但对于评分的人来说,我认为我的原始代码对他们来说是可行的,因为他们将使用linux系统。至少我希望如此。如果您只需要访问特定的环境变量,请不要使用
environ
GetEnvironmentStrings
,只需使用标准的
getenv()
函数即可。如果您需要更新环境变量,
setenv()
putenv()
更灵活@keithThompson我对此非常了解,但我需要列出所有环境变量。系统(“set”)在我的系统上完成了这项工作,所以我只是注释掉了原始代码,供评分器稍后测试。
LPTCH WINAPI GetEnvironmentStrings(void);