Как я могу избежать этой ошибки с setenv в C? - PullRequest
0 голосов
/ 05 октября 2018

Первое раскрытие: я не большой программист на Си.Я пытаюсь скомпилировать набор кодов 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;
}

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

#define _POSIX_C_SOURCE

и

#define _GNU_SOURCE

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Установка или изменение переменной среды в прошлом были проблематичными.С фиксированной областью памяти для блока среды были использованы различные решения.К ним относятся цепочки фрагментов памяти и использование 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.

0 голосов
/ 05 октября 2018

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

setenv("CCX_JOBNAME_GETJOBNAME",jobnamec,1)

в своей исходной основной программе на C на

putenv("CCX_JOBNAME_GETJOBNAME=jobnamec")

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

0 голосов
/ 05 октября 2018

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

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

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

...