2013-03-29 33 views
3

我想使用'environ'變量,但它一直給我一個錯誤。這似乎是一個生成文件/編譯錯誤,我似乎無法修復它。我已經搜索了答案,但我仍然迷失。對'environ'的未定義引用?

這裏是我的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 

從我這個搜索交易與鏈接庫,但我不知道如何適用於我的具體情況。如果有人能幫我一把,我會很感激。

+2

你在什麼系統上?一個簡單的「hello,world」程序是否編譯,鏈接和正確執行? –

+0

我在Windows 7上,是的,一切正常,直到我試圖使用'環境'。 – blutuu

+0

你使用的是什麼gcc? Cygwin的? MinGW的?還有別的嗎? –

回答

3

並非Windows上的所有(如果有)編譯器均可通過名爲environ的全局符號訪問環境變量。

您可以使用例如getenv()來訪問環境變量。

win32 API提供了GetEnvironmentStrings()來訪問所有變量。

有些平臺允許您通過一個額外的參數給main(),你宣佈你的主要功能爲訪問環境:

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

Cygwin在Windows之上提供了一個類似POSIX的環境。 OP可能不使用Cygwin。 –

+0

@KeithThompson我想我會使用getenv,putenv和setenv(如我的指令中列出的)而不是environ的結論。因爲我的指示沒有明確說明它,這些方法是否足以替代環境? – blutuu

+0

在做了一些閱讀和理解之後,我認爲在這個答案中建議的方法對我個人而言是有效的,但對於評分者,我認爲我的原始代碼對他們來說很有用,因爲他們會使用Linux系統。至少我希望。 – blutuu

2

environ全局變量是由POSIX定義,並且不支持通過Windows(除非你使用Cygwin,這是一個在Windows之上實現的類似POSIX的層)。

據我所知,非標清

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

也不會支持Windows。

但快速谷歌搜索變成了this answer,它指向了Windows的特定GetEnvironmentStrings函數的文檔:

LPTCH WINAPI GetEnvironmentStrings(void); 

如果函數成功,返回值是一個指向 環境阻止當前進程。

如果函數失敗,則返回值爲NULL

結果指向一個長字符串,環境變量由'\0'空字符分隔,環境由兩個連續的空字符終止。

LPTCH是Microsoft的typedef,用於指向unsigned char或16位wchar_t的指針。有關更多信息,請參閱參考文檔。