3

「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;
}

ここにmakefileがあります:

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() に追加の引数を介して環境にアクセスできます。メイン関数を次のように宣言します。

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

グローバル変数はenvironPOSIX で定義されており、Windows ではサポートされていません (Windows の上に実装された POSIX に似たレイヤーである Cygwin を使用している場合を除く)。

私の知る限り、非標準の定義は

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

Windows でもサポートされていません。

しかし、簡単な Google 検索でこの回答が見つかりました。これは、Windows 固有のGetEnvironmentStrings関数のドキュメントを示しています。

LPTCH WINAPI GetEnvironmentStrings(void);

関数が成功した場合、戻り値は現在のプロセスの環境ブロックへのポインターです。

関数が失敗した場合、戻り値はNULLです。

結果は、null 文字で区切られた環境変数を持つ長い文字列を指し、'\0'環境は 2 つの連続する null 文字で終了します。

LPTCHunsigned charは、または 16 ビットへのポインタに対する Microsoft の typedefですwchar_t。詳細については、参照ドキュメントを参照してください。

于 2013-03-29T02:02:05.787 に答える