3

我正在尝试使用“环境”变量,但它一直给我一个错误。这似乎是一个 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;
}

这是生成文件:

CC = gcc
CFLAGS = -c
CFLAGS-y = -std=c99

all: cmd

cmd.o: cmd.c cmd.h
    $(CC) $(CFLAGS) $(CFLAGS-y) cmd.c

cmd.exe: cmd.o
    $(CC) -o cmd.exe cmd.o  

clean:
    rm -rf *.o cmd.exe a.out

这是输出:

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

从我搜索的内容来看,这涉及链接库,但我不知道如何将其应用于我的具体情况。如果有人可以帮我一把,我将不胜感激。

4

2 回答 2

3

并非 Windows 上的所有(如果有的话)编译器都通过名为environ.

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

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

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

int main(int argc, char *argv[], char *environ[])
于 2013-03-29T01:45:49.503 回答
2

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

据我所知,非标准定义

int main(int argc, char **argv, char **envp) { /* ... */ }

Windows 也不支持。

但是快速的谷歌搜索出现了这个答案,它指向 Windows 特定的 GetEnvironmentStrings函数的文档:

LPTCH WINAPI GetEnvironmentStrings(void);

如果函数成功,则返回值是指向当前进程的环境块的指针。

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

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

LPTCH是 Microsoft 的 typedef,用于指向unsigned char或者 16-bit的指针wchar_t。有关详细信息,请参阅参考文档。

于 2013-03-29T02:02:05.787 回答