2013-03-29 4 views
3

Я пытаюсь использовать переменную 'environ', но она продолжает давать мне ошибку. Кажется, это ошибка makefile/build, и я не могу ее исправить. Я искал ответы, но все же я потерян.Неопределенная ссылка на '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; 
} 

и вот 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 

Из того, что я искал это дело с связыванием библиотек, но я не знаю, как применить это к моей конкретной ситуации. Если бы кто-то дал мне руку, я был бы признателен.

+2

В какой системе вы используете? Скомпилирована ли простая программа «привет, мир», ссылка и выполнение? –

+0

Я нахожусь в Windows 7, и все работает нормально, пока я не попытался использовать «environment». – blutuu

+0

Какой gcc вы используете? Cygwin? MinGW? Что-то другое? –

ответ

3

Не все (если есть) компиляторы в Windows предоставляют доступ к переменным среды через глобальный символ с именем environ.

Вы можете использовать, например. getenv() для доступа к переменным среды.

API win32 предоставляет GetEnvironmentStrings() для доступа ко всем переменным.

Некоторые платформы позволяют получать доступ к среде через дополнительный аргумент в основной(), вы бы объявить основную функцию:

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

Cygwin предоставляет среду, похожую на POSIX, поверх Windows. OP, вероятно, не использует Cygwin. –

+0

@KeithThompson Я думаю, что я прихожу к выводу, используя getenv, putenv и setenv (как указано в моих инструкциях) вместо среды. Поскольку в моих инструкциях явно не указано это, будут ли эти методы достаточными заменами для среды? – blutuu

+0

После некоторого чтения и понимания, я думаю, что метод, предложенный в этом ответе, будет работать для меня лично, но для оценки человека я считаю, что мой оригинальный код будет работать для них, поскольку они будут использовать систему Linux. По крайней мере, я надеюсь. – blutuu

2

environ глобальная переменная определяется POSIX и не поддерживается Windows (если вы не используете Cygwin, который является POSIX-подобным слоем, реализованным поверх Windows).

Насколько я знаю, нестандартное определение

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

также не поддерживается в Windows.

Но быстрый поиск Google оказался this answer, что указывает на документацию для Windows, определенной GetEnvironmentStrings функции:

LPTCH WINAPI GetEnvironmentStrings(void); 

Если функция завершается успешно, возвращаемое значение является указателем на среде блок текущего процесса.

Если функция не работает, возвращаемое значение равно NULL.

В результате указует на длинную строку с переменными средами, разделенной '\0' нулевыми символами, с окружающей средой, завершенной двумя последовательными нулевыми символами.

LPTCH является типичным типом Microsoft для указателя на unsigned char или 16-разрядный wchar_t. Дополнительную информацию см. В справочной документации.

Смежные вопросы