Как я могу избежать этой ошибки с setenv в C?

Первое раскрытие: я не большой программист на Си. Я пытаюсь скомпилировать набор кодов C и Fortran с большой родословной, используя Makefile для генерации исполняемого файла для инженерных вычислений. Я использую gcc 4.7.1 на sgi Irix (6.5.30). Во время компиляции основной программы сначала я получаю предупреждение о 'неявном объявлении функции'setenv'. Впоследствии, после генерации всех целевых файлов 'o', компиляция заканчивается с ошибкой:

ld32: Ошибка 33: неразрешенный символ данных "setenv"

Закомментирование единственной строки, в которой определено "setenv", позволяет выполнить компиляцию и создать исполняемый файл. Однако строка с setenv имеет решающее значение для программы.

Это заставило меня написать тестовый код и подтвердить ту же проблему:

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
int main()
{
   setenv("FILE","/usr/bin/example.c",50);
   printf("File = %s\n", getenv("FILE"));
   return 0;
}

Основываясь на всех предложениях, которые я нашел, когда гуглял здесь на стеке и других сайтах, я попытался включить различные заголовки, такие как

#define _POSIX_C_SOURCE

а также

#define _GNU_SOURCE

до любых #define заявлений. Я также попытался скомпилировать с -std=c99 так же как -D_XOPEN_SOURCE а также -D_GNU_SOURCE без удачи

Я также попытался скомпилировать тестовую программу с помощью собственного компилятора C Irix (cc и c99), и я получаю ту же ошибку:

Неразрешенный текстовый символ 'setenv'

Может ли кто-нибудь помочь в поиске того, что еще мне нужно искать в моей системе и / или в переменных среды, чтобы устранить эту ошибку?

3 ответа

Похоже, что IRIX libc не поддерживает setenv() команда. Вам придется переписать его с putenv() как это:

putenv("FILE=/usr/bin/example.c");

Смотрите также справочную страницу IRIX putenv(). Находясь в поиске setenv() там не отображаются никакие попадания, поэтому я предполагаю, что эта функция отсутствует (примечание: IRIX 6.5.30 с 2006 года)

Задание или изменение переменной среды было проблематичным в прошлом. С фиксированной областью памяти для блока среды были использованы различные решения. К ним относятся цепочки фрагментов памяти и использование realloc(3). Не было никакого стандартного способа изменить блок среды, даже теперь C99 специально исключает putenv(3) и не упоминает setenv(3).

POSIX включает в себя как setenv (3) и putenv (3), которые делают аналогичную работу. Стандарт заявляет, однако, что setenv(3) является предпочтительной функцией:

"Было много споров о том, должна ли функция System V putenv() или функция BSD setenv() быть обязательной. Функция setenv () была выбрана потому, что она позволяла реализовать функцию unsetenv () для удаления. переменные окружения, без указания дополнительного интерфейса. Функция putenv () доступна как расширение XSI."

Ни один не потокобезопасный.

Это может быть дубликат, хотя в нем конкретно упоминается C99, а не gcc,

Спасибо вам всем, моя проблема решена! Я заменил

setenv("CCX_JOBNAME_GETJOBNAME",jobnamec,1)

в моей оригинальной основной C-программе с

putenv("CCX_JOBNAME_GETJOBNAME=jobnamec")

и я смог скомпилировать коды до завершения, чтобы создать окончательный исполняемый файл.

Другие вопросы по тегам