visual-studio - 하드 코딩 버전 관리에서 Visual Studio 2015를 중지하는 방법

기사 출처 visual-studio visual-c++ visual-studio-2015

나는 현재 실행 파일을 만드는 C++ VS2015 프로젝트에서 일하고 있습니다.

단순히 숫자를 정의하는 version.h 파일이 있습니다.

#define VERSION_MAJOR               3
#define VERSION_MINOR               0
#define VERSION_REVISION            0
#define VERSION_BUILD               2
#define VER_FILE_VERSION            VERSION_MAJOR, VERSION_MINOR, VERSION_REVISION, VERSION_BUILD
...


이 version.h는 프로젝트의 .rc 파일에서 실행 파일의 버전 정보를 정의하는 데 사용됩니다.

.rc 파일은 다음과 같습니다

#include "resource.h"
#include "version.h"
...
VS_VERSION_INFO VERSIONINFO
 FILEVERSION VER_FILE_VERSION
 ...


따라서 내 문제는 resource.h가 수정되는 것과 같은 리소스를 추가 할 때마다 Visual Studio 2015는 .rc 파일에서 #include "version.h"를 제거하고 대신 "version에서 발견 된 모든 값을 하드 코딩하는 것 같습니다. h ".

문제의 .rc 파일 예

#include "resource.h"
...
VS_VERSION_INFO VERSIONINFO
 FILEVERSION 3,0,0,2
 ...


그래서 내 질문은 VS2015가 이것을하지 못하게하는 방법입니다.
실제로 Visual Studio의 기본 제공 리소스 편집기에서이를 수행하지 못하게 할 수는 없습니다. 리소스 편집기 (예 : GUI)를 사용하여 리소스 파일의 항목을 변경할 때마다 리소스 파일의 코드가 재생성됩니다. 이것은 기호 상수를 대체하거나 리터럴을 사용한 산술, 조건부로 정의 된 코드 블록 제거, 신중한 수동 형식 지정 등을 포함하여 모든 종류의 수동 조정을 리소스 파일에 적용합니다. 따라서 리소스 파일을 수동으로 편집하는 것은 좋지 않습니다.

자원 편집기가 방해하지 않는 자원 파일을 수동으로 편집 할 수 있어야하는 경우 프로젝트에 두 번째 자원 파일을 추가하여이를 달성 할 수 있습니다. 일반적으로 .rc2 확장자가 있습니다. Visual Studio의 리소스 편집기는 이러한 리소스를 직접 편집하지 않으므로 모든 편집을 수동으로 수행해야합니다. 그러나 일단 올바르게 설정하면 거기에 넣은 모든 리소스가 여전히 바이너리에 연결되어 최종 결과를 동등하게 만듭니다.

이것은 정상적인 버전 관리를 얻는 유일한 방법이며 내 프로젝트에서 사용합니다. 예를 들면 다음과 같습니다.

//
// MyProj.RC2 - resources Microsoft Visual C++ does not edit directly
//

#ifdef APSTUDIO_INVOKED
   #error this file is not editable by Microsoft Visual C++
#endif  // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// Version
//

#include "Version.h"


VS_VERSION_INFO VERSIONINFO
 FILEVERSION     VERSION_MYPROJ_MAJOR,VERSION_MYPROJ_MINOR,VERSION_MYPROJ_REVISION,0
 PRODUCTVERSION  VERSION_MYPROJ_MAJOR,VERSION_MYPROJ_MINOR,VERSION_MYPROJ_REVISION,0
 FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 FILEOS 0x40004L
 FILETYPE 0x1L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904b0"
        BEGIN
            VALUE "CompanyName", "Cody Gray"
            VALUE "FileDescription", "The World's Greatest Application"
            VALUE "FileVersion", VERSION_MYPROJ_FULL
            VALUE "InternalName", "MyProj"
            VALUE "LegalCopyright", "Copyrights are for suckers!"
            VALUE "OriginalFilename", "MyProj.exe"
            VALUE "ProductName", "MyProj"
            VALUE "ProductVersion", VERSION_MYPROJ_FULL
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1200
    END
END


여기에 다른 자료도 넣을 수 있습니다. 예를 들어, 현재 작업중인 한 응용 프로그램에는 "디버그"빌드에만 연결하려는 대화 상자 리소스가 있습니다 (내부 디버그 관련 옵션을 구성하기위한 것임). 대화 상자의 정의를 #ifdef DEBUG로 줄이려고 시도했지만 리소스 편집기는 실행될 때마다 해당 블록 전체를 제거했습니다. 대신 대화 상자의 정의를 .rc2 파일로 이동하여 #ifdef로 줄 바꿈했습니다. 리소스 편집기를 사용하여 편집하는 기능을 잃어 버렸지 만 드물게 변경 해야하는 경우 수동으로 편집 할 수 있기 때문에 그다지 신경 쓰지 않습니다. 그리고 적어도 자동으로 제거되지는 않습니다.

마지막 키는이 .rc2 파일을 리소스 편집기에서 컴파일하여 바이너리에 연결하는 것입니다. 이렇게하려면 주 리소스 파일 (.rc)을 편집해야하지만이 변경 사항은 유지됩니다. 편집하려는 부분은 TEXTINCLUDE 리소스입니다. 내 .rc 파일에서 해당 섹션은 다음과 같습니다.

/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE 
BEGIN
    "Resource.h\0"
END

2 TEXTINCLUDE 
BEGIN
    "#ifndef APSTUDIO_INVOKED\r\n"
    "#include ""TargetVer.h""\r\n"
    "#endif\r\n"
    "#include ""AfxRes.h""\r\n"
    "#include ""VerRsrc.h""\r\n"
    "#include ""Version.h""\r\n"
    "\0"
END

3 TEXTINCLUDE 
BEGIN
    "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"
    "LANGUAGE 9, 1\r\n"
    "#include ""MyProj.rc2""     // non-Microsoft Visual C++ edited resources\r\n"
    "#include ""AfxRes.rc""      // standard components\r\n"
    "#endif\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


중요한 부분은 MyProj.rc2가 세 번째 TEXTINCLUDE 섹션에서 #include되는 위치입니다. 여기에있는 모든 텍스트는 리소스 컴파일러가 실행될 때마다 리소스 파일에 직접 덤프되므로 리소스 파일의 끝에 다음과 같이 친숙한 자동 생성 섹션이 표시됩니다.

#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE 9, 1
#include "MyProj.rc2"     // non-Microsoft Visual C++ edited resources
#include "AfxRes.rc"      // standard components
#endif

/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED


this technical note에서 설명한 것처럼 Visual Studio의 MFC 프로젝트 템플릿에서이 예제를 사용하여 조각을 모으는 방법을 알 수없는 경우 언급하면됩니다.

이 질문에 대해 Stack Overflow에서 비슷한 토론을 찾았습니다: https://stackoverflow.com/questions/37926134/

관련 기사
c# - Hololens Apps가 더 이상 빌드되지 않음-인용 메타 데이터 파일 누락 및 c-Sharp.firstpass를 찾을 수 없음
c# - 확장에서 Visual Studio 설정을 작성해도 유지되지 않습니다
visual-studio - Universal Windows 플랫폼에 대한 전 처리기 정의?
c++ - VS 2012를 VS 2015로 마이그레이션 한 후 C++ 프로젝트의 Xmemory 오류
c# - 다음 페이지의 헤더에서 일부 데이터를 제거하는 방법 (RDLC 보고서)
git - Visual Studio에서 git commit hash를 dll 버전 번호로 설정
c# - xamarin ios c# 밑줄 UIButton 텍스트
.net - VS에서 이전 .NET 프레임 워크를 어떻게 선택할 수 있습니까?
c# - Visual Studio에서 모든 파일의 버전을 변경하는 방법
c++ - 솔루션 탐색기에서 소스 폴더 계층 구조를 유지하는 방법은 무엇입니까?