헬마입니다.

  이제 마지막 글입니다. 총 3개의 글로 올라갈 것 같네요. 워낙 타자 속도가 느리니 이정도 글 번역하는데 며칠이 걸리는지 모르겠네요.

원문 글 링크 : http://blogs.msdn.com/vcblog/archive/2010/03/02/visual-studio-2010-c-project-upgrade-guide.aspx


VS2010 에서 변환작업에 대해 알려진 문제점

VS2010 에서 변환작업에 대해 알려진 문제점이 몇가지 있습니다 :

    1. 대상 프레임워크 버전
        변환 후에 관리되는 C++ 프로젝트는 기본값으로 4.0 프레임워크를 대상으로 합니다. 이러한 동작의 숨겨진 이유는 VS2010 컴파일러는 프레임워크 2.0, 3.0, 3.5를 대상으로 할 수 없기때문입니다. VS2008 컴파일러는 반드시 2.0, 3.0 또는 3.5 를 대상으로 해야합니다. 변환된 C++ 어플리케이션이 빌드되도록 하기위해 우리는 TargetFrameworkVersion 을 C++ 어플리케이션에 대해서 4.0 을 기본값으로 변경했습니다. C++ 어플리케이션은 아래의 방법들 중 하나를 사용하여 다른 프레임워크 (예: 3.5 ) 를 대상으로 할 수 있습니다 .
        - vcxproj 파일을 편집하고 첫번째 속성 그룹에서 아래와 같은 줄을 추가로 선언합니다 :
            <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>       
        - VS2010 명령행을 열어 set TargetFrameworkVersion=3.5 를 실행 후 start devenv.exe 를 통해 IDE 를 실행합니다. 이렇게 하면 여러분의 모든 C++ 어플리케이션의 v3.5 프레임워크를 대상으로 합니다.
        - 어플리케이션을 빌드할 때 MSBuild 에 /p:TargetFrameworkVersion=v3.5 를 넘깁니다 : MSBuild my.vcxproj /p:TargetFrameworkVersion=v3.5

        알림 : 어플리케이션이 2.0, 3.0, 3.5 를 대상으로 하려면 컴퓨터에 VS2008 이 설치되어 있어야합니다.
        C#/VB 어플리케이션의 경우에는 변환 후에도 대상되는 프레임워크가 설치되어있다면 대상 프레임워크를 변경하지 않습니다. 만약 대상이 되는 프레임워크가 설치되어있지 않다면, 여러분은 요구되는 프레임워크를 내려받거나 대상 프레임워크를 4.0으로 하는 것중 선택할 수 있습니다.

        - 만약 여러분의 솔루션에 C#/VB/관리되는 C++ 프로젝트가 섞여있다면, 여러분은 C#/VB 어플리케이션과 관리되는 C++ 어플리케이션이 서로 다른 프레임워크를 대상으로 삼고 있는 현상을 겪을 수 있습니다. 만약 참조된 프로젝트가 참조하는 프로젝트의 프레임워크 버전보다 더 높은 프레임워크 버전을 가지고 있다면 MSB3258 경고를 겪을 수 있습니다.
        -
        - 또는 C4691 과 같은 경고를 겪을 수 있습니다 : type referenced was expected in the unreferenced assembly ‘file’, type defined in current translation unit used instead, if the Framework version of the referencing project is higher.

        - 여러분 솔루션의 모든 프로젝트를 같은 프레임워크 버전으로 대상을 다시 지정해야합니다.

    2. makefile "Output" 디렉토리에서 사용되는 따옴표
        만약 "Output" 속성에 따옴표가 사용된 makefile 프로젝트를 가지고 있다면, 변환이 실패합니다. 이 문제를 해결하려면 변환을 하기전에 "Output" 속성에서 따옴표를 제거하면 됩니다.

    3. $(IntDir) 과 $(OutDir) 에서 역슬래시
        $(IntDir) 과 $(OutDir) 은 속성 페이지에서 "General -> Intermediate Directories" 와 "General -> Output Directories" 를 통해 확인할 수 있습니다. $(IntDir) 과 $(OutDir) 의 서식을 맞추기위해 이 값들을 변환할 때 어느 하나가 "\" 를 가지고 있지 않다면 의도적으로 "\" 를 추가합니다. 마지막에 "/" 가 있다면 제거됩니다.

        그러나, 이러한 작업은 $(IntDir) 또는 $(OutDir) 이 makefile 또는 Exec 작업이 사용된 사용자 빌드에서 사용되는 빌드 시나리오를 망가뜨릴 수 있습니다.

        makefile 의 경우에 nmake 도구는 끝문자가 "\" 인 값을 평가하지 못합니다. 예를 들어, 아래와 같은 명령입니다.

BuildCommandLine="nmake /nologo &quot;OUT=$(OutDir)&quot; &quot;OBJ=$(IntDir)&quot;"

        왜냐하면, $(OutDir) 과 $(IntDir) 은 마지막 "\" 문자를 가졌고 nmake 도구는 이것들을 적절히 확장하지 못하고 OUT 과 OBJ 는 결과적으로 빈문자열로 평가받습니다. 이러한 문제를 고치려면 속성페이지에서 $(IntDir) 과 $(OutDir) 에 대해서 "\" 를 제거해야합니다.

        $(OutDir) 또는 $(IntDir) 를 사용자 빌드 -빌드 이벤트, 사용자 빌드 도구, 사용자 빌드 단계를 포함하여 - 에 넘겼다면 도구들에 의해 "\" 문자가 탈출문자로 취급될수도 있다는 점으로 인해 빌드 실패를 겪을 수 있습니다. 예를 들어, 아래와 같은 사전빌드 이벤트를 가지고 있다고 해보죠. 

        명령행은 다음과 같이 될겁니다 : cl /c /Fo"Debug\\" "C:\foo\win32.cpp" 대신 cl /c /Fo"Debug\" "C:\foo\win32.cpp" 로 말입니다.
        이러한 문제점을 수정하려면, 탈출문자를 완성하기 위해 /Fo 에 넘겼던 값( C/C++ -> Output Files -> Object File Name ) 에 "\" 문자를 추가합니다.

    4. 솔루션 탐색기 UI
        VS2010 에서 솔루션 탐색기에서 폴더와 파일의 표시는 .vcxproj.filters 파일에 의해 제어됩니다. 다른 범위하에서 같은 이름을 가진 폴더들이 있다면, 예를 들어, "Native\Include" 와 "Include" 라면, 두번째 "Include" 와 "Include" 하위의 파일들은 변환후에 솔루션 탐색기에 나타나지 않습니다. 이 문제를 우회하려면, 솔루션 탐색기에서 폴더를 재생성하고 이 폴더에 관련 파일들을 추가합니다.

    5. 읽기 전용 프로젝트 파일 또는 디렉토리
        읽기 전용 디렉토리에서 업그레이드를 하거나 이전에 변환했떤 프로젝트 파일이 읽기전용일 때 재변환하면 문제를 겪을 수 있습니다. 파일들과 디렉토리들을 쓰기가능한지 확인하지 않으면, 통합된 소스 제어 시스템과 마찬가지로 자동으로 체크아웃될 수 있습니다.

댓글을 달아 주세요