C++ 如何修复MSVC 2005错误:未解析的外部符号\uuu环境

C++ 如何修复MSVC 2005错误:未解析的外部符号\uuu环境,c++,c,environment-variables,visual-c++,C++,C,Environment Variables,Visual C++,在我的应用程序中,我需要直接访问_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'

在我的应用程序中,我需要直接访问_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标志)

现在,我得到了这个错误:

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()的文件。所以比以前多了一个错误。

我不确定我是否理解,()有什么问题?它是全局变量_environ的函数等价物。它是多字节的,而不是unicode,因此它应该可以在VS2005编译器针对的所有平台上正常工作。“_s”表示“安全”,这意味着该操作被重新设计,以减少黑客通过缓冲区溢出等进行攻击的可能性。

我必须使用上面的代码才能工作。该代码将覆盖_environ指向的内存。据我所知,没有MSVC函数可以做到这一点。OP正在尝试从全局共享的libc变量中删除一个环境变量。我不知道有哪个库函数可以为OP执行该操作,如果它能以线程安全的方式执行该操作,那就太好了。对不起,我现在看到了。据我所见,删除环境变量的唯一可靠方法是使用Win32函数SetEnvironmentVariable并为该值传递NULL。此API仅在Windows 2000及以上版本上受支持。如果我想让它在Win98及以上版本上工作,我该怎么办?根据VS 2008文档,SetEnvironmentVariable的要求是:客户端:需要Windows Vista、Windows XP、Windows 2000 Professional、Windows NT工作站、Windows Me、Windows 98或Windows 95。MSDN可能反映了对Windows 98的支持已经中断。我在这里读到了一些字里行间的信息,但听起来像是:您已经做了一些实验,可以使用相同的编译和链接标志链接到_-wenviron变量,但没有_-environ?我只是尝试过:我重新编码它以使用_-wenviron(这对我来说并不是一个真正的解决方案,只是为了测试),但后来我得到了一个错误:未解析的外部符号_wenviron