【发布时间】:2011-01-10 12:43:19
【问题描述】:
在我的应用程序中,我需要直接访问 _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
我在here 和许多其他地方读到过这个变量已经过时和弃用。我想知道可能的解决方案。我也不能使用 _wenviron 变量,因为我们要支持 Windows 98。
在项目设置中,我明确将其设置为使用 MBCS(即,不是 Unicode)。我在这里有点迷茫。还有什么我必须设置的吗?
只是为了测试,我也尝试了 Unicode 版本。 IE。这段代码:
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() 的文件。所以比以前多了一个错误。
【问题讨论】:
-
我在字里行间读到这里,但听起来像:您已经做了一些实验,并且您能够使用相同的编译和链接标志链接到 _wenviron 变量,但不能使用 _environ?跨度>
-
我刚刚尝试过:我将它重新编码为使用 _wenviron(这对我来说并不是真正的解决方案,而只是用于测试),但后来我得到了错误:未解析的外部符号 __wenviron
标签: c++ c environment-variables visual-c++