2010-01-28 89 views
1

在我的應用程序中,我需要直接訪問_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文件()。所以比以前更多的錯誤。

+0

我正在閱讀這裏的行,但它聽起來像:你做了一些實驗,你能夠使用相同的編譯和鏈接標誌鏈接到_wenviron變量,但不能使用_environ? – 2010-01-28 18:07:43

+0

我只是想:我重新編寫它使用_wenviron(這不是一個真正的解決方案,但只是爲了測試),但後來我得到了錯誤:無法解析的外部符號__wenviron – Albert 2010-01-28 18:20:12

回答

0

我不確定我明白,getenv_s()有什麼問題?它是全局變量__environ的等效函數。它是多字節而不是unicode,所以它應該在VS 2005編譯器的目標平臺上正常工作。 「_s」的意思是「安全」,這意味着操作被重新設計,以減少黑客通過緩衝區溢出等利用。

+0

我必須上面的代碼才能工作。該代碼將覆蓋_environ指向的內存。我不知道哪些MSVC功能可以做到這一點。 – Albert 2010-01-28 18:06:25

+0

OP正試圖從全局共享的libc變量中刪除一個環境變量。我不知道爲OP執行該操作的庫函數,它可以很好,因爲它可以以線程安全的方式執行。 – 2010-01-28 18:08:31

+0

對不起,我現在看到了。從我所看到的,刪除環境變量的唯一可靠方法是使用Win32函數SetEnvironmentVariable併爲該值傳遞NULL。此API僅在Windows 2000及更高版本上受支持。 – 2010-01-28 18:21:57

相關問題