在我的應用程序中,我需要直接訪問_environ變量,因爲我必須擁有像glibc unsetenv(不能與setenv或putenv一樣)的內容。我該如何修復MSVC 2005錯誤:無法解析的外部符號__environ
這是我需要使用代碼:
//////////////////////
// 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版本。即此代碼:
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? – 2010-01-28 18:07:43
我只是想:我重新編寫它使用_wenviron(這不是一個真正的解決方案,但只是爲了測試),但後來我得到了錯誤:無法解析的外部符號__wenviron – Albert 2010-01-28 18:20:12