C 未定义对'的引用;环境';?
我试图使用'environ'变量,但它总是给我一个错误。这似乎是一个makefile/build错误,我似乎无法修复它。我寻找了很多答案,但还是迷路了 这是我的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;
#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);