Как я могу исправить ошибку MSVC 2005: неразрешенный внешний символ __environ - PullRequest
1 голос
/ 28 января 2010

В моем приложении мне нужен прямой доступ к переменной _environ, потому что у меня должно быть что-то вроде glibc unsetenv (этого не может быть с setenv или putenv).

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

//////////////////////
// unsetenv for WIN32, taken from libc source
int unsetenv(const char *name)
{
  size_t len;
  char **ep;

  if (name == NULL || *name == '\0' || strchr (name, '=') != NULL)
    {
      return -1;
    }

  len = strlen (name);

  ep = _environ;
  while (*ep != NULL)
    if (!strncmp (*ep, name, len) && (*ep)[len] == '=')
      {
    /* Found it.  Remove this pointer by moving later ones back.  */
    char **dp = ep;

    do
      dp[0] = dp[1];
    while (*dp++);
    /* Continue the loop in case NAME appears again.  */
      }
    else
      ++ep;

  return 0;
}

Он работал нормально, пока у нас не возникли проблемы с манифестами в некоторых системах, поэтому мы попытались использовать статическую версию библиотеки времени выполнения (/ MT flag).

Теперь я получаю эту ошибку:

unresolved external symbol __environ

Я прочитал здесь и во многих других местах, где эта переменная устарела и устарела. Интересно о возможном решении. Я также не могу использовать переменную _wenviron, потому что мы хотим поддерживать Windows 98.

В настройках проекта я явно настроил его на использование MBCS (т. Е. Не Unicode). Я немного споткнулся здесь. Что-нибудь еще, что я должен установить?

Просто для тестирования я также попробовал версию Unicode. То есть этот код:

int unsetenv(const wchar_t *name)
{
  size_t len;
  wchar_t **ep;

  if (name == NULL || *name == '\0' || wcschr (name, '=') != NULL)
    {
      return -1;
    }

  len = wcslen (name);

  ep = _wenviron;
  while (*ep != NULL)
    if (!wcsncmp (*ep, name, len) && (*ep)[len] == '=')
      {
    /* Found it.  Remove this pointer by moving later ones back.  */
    wchar_t **dp = ep;

    do
      dp[0] = dp[1];
    while (*dp++);
    /* Continue the loop in case NAME appears again.  */
      }
    else
      ++ep;

  return 0;
}

Мне немного интересно, почему это даже скомпилировано, потому что я явно настроил его на использование MBCS, а не Unicode. Но, возможно, это означает что-то еще. (Может ли кто-нибудь просветить меня здесь?)

В любом случае, это приводит к следующим ошибкам:

1>AuxLib.obj : error LNK2001: unresolved external symbol __wenviron
1>ExtractInfo.obj : error LNK2001: unresolved external symbol __environ

AuxLib.obj - это файл с этим unsetenv (). Так что на одну ошибку больше, чем раньше.

1 Ответ

0 голосов
/ 28 января 2010

Я не уверен, что понимаю, что не так с getenv_s ()? Это функциональный эквивалент глобальной переменной __environ. Он является многобайтовым, а не юникодным, поэтому он должен нормально работать на всех платформах, предназначенных для компилятора VS 2005. «_s» означает «безопасный», что означает, что операция была перепроектирована для уменьшения возможности ее использования хакерами через переполнение буфера и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...