2010-01-28 3 views
1

내 응용 프로그램에서는 glen unsetenv 같은 것이 있어야하기 때문에 _environ 변수에 직접 액세스해야합니다 (setenv 또는 putenv를 사용할 수 없음)./MT 우리는 일부 시스템에서 매니페스트 몇 가지 문제를 가지고 때까지어떻게 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; 
} 

그것은 좋은 일했다, 그래서 우리는 런타임 라이브러리의 정적 버전 (사용하려고 :

은 내가 사용하는 데 필요한 코드입니다 깃발). 나는 here를 읽고이 변수가 쓸모 없게하고 사용되지 않는 한 많은 다른 장소에서

unresolved external symbol __environ 

:

지금, 나는이 오류를 얻고있다. 가능한 해결책에 대해 궁금합니다. 또한 우리는 Windows 98을 지원하기를 원하기 때문에 _wenviron 변수를 사용할 수 없습니다.

프로젝트 설정에서 MBCS (유니 코드가 아님)를 사용하도록 명시 적으로 설정했습니다. 나는 약간 비틀 거렸다. 내가 설정해야 할 것이 있습니까?

테스트를 위해서도 유니 코드 버전을 사용해 보았습니다. 나는. 이 코드는

내가 왜 명시 적으로 MBCS가 아닌 유니 코드를 사용하도록 설정했기 때문에 컴파일 된 이유인지 궁금합니다. 하지만 아마도 그게 다른 것을 의미 할 수도 있습니다. (누군가가 여기 가르치 려 수 있습니까?)

어쨌든,이 이러한 오류가 발생합니다

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

AuxLib.obj이 unsetenv를 사용하여 파일()입니다. 그래서 한 번 더 오류가 발생했습니다.

+0

나는이 줄 사이를 읽고 있는데, 몇 가지 실험을하고 동일한 컴파일 및 링크 플래그를 사용하여 _wenviron 변수에 링크 할 수 있지만 _environ은 사용할 수 없습니까? –

+0

방금 ​​시도 : 그 _wenviron (정말 나를 위해 해결책이 아니었지만 테스트를 위해)을 사용하기 위해 그것을 recoded,하지만 난 오류가있어 : 해결되지 않은 외부 기호 __wenviron – Albert

답변

0

잘 모르겠는데 getenv_s()의 문제점은 무엇입니까? 전역 변수 __environ과 동등한 함수입니다. 유니 코드가 아닌 멀티 바이트이므로 VS 2005 컴파일러가 목표로하는 모든 플랫폼에서 제대로 작동해야합니다. "_s"는 "안전함"을 의미합니다. 즉, 버퍼 오버 플로우 등을 통해 해커의 악용 가능성을 줄이기 위해 작업을 다시 설계했습니다.

+0

나는 작동하도록 위의 코드를해야합니다. 이 코드는 _environ이 가리키는 메모리를 덮어 씁니다. 내가 할 수있는 MSVC 기능이 없다. – Albert

+0

OP가 전역 공유 libc 변수에서 환경 변수를 삭제하려고합니다. 나는 OP를 위해 그 연산을 수행하는 라이브러리 함수를 모른다. 그리고 thread-safe 방식으로 할 수 있기 때문에 좋을 것이다. –

+0

죄송합니다, 이제 알겠습니다. 필자가 본 바로는 환경 변수를 삭제하는 신뢰할 수있는 유일한 방법은 Win32 함수 SetEnvironmentVariable을 사용하고 값에 NULL을 전달하는 것입니다. 이 API는 Windows 2000 이상에서만 지원됩니다. –

관련 문제