연습: STL 라이브러리를 헤더 단위로 가져오기

이 연습에서는 Visual Studio에서 C++ STL(표준 템플릿 라이브러리) 라이브러리를 헤더 단위로 가져오는 방법을 보여 줍니다. 표준 라이브러리를 가져오는 더 빠르고 강력한 방법은 자습서: 모듈을 사용하여 C++ 표준 라이브러리 가져오기를 참조 하세요.

STL 헤더를 헤더 단위로 가져오는 것은 미리 컴파일된 헤더 파일을 사용하는 것보다 간단합니다. 헤더 단위는 설정 및 사용이 더 쉬우며, 디스크에서 상당히 작고, 비슷한 성능 이점을 제공하며, 공유 PCH보다 더 유연합니다.

헤더 단위 및 헤더 단위가 제공하는 이점에 대한 자세한 내용은 헤더 단위란?을 참조하세요. 헤더 단위를 표준 라이브러리를 가져오는 다른 방법과 대조하려면 헤더 단위, 모듈 및 미리 컴파일된 헤더 비교를 참조 하세요.

필수 조건

헤더 단위를 사용하려면 Visual Studio 2022 이상 또는 Visual Studio 2019 버전 16.11 이상을 사용합니다. /std:c++20 헤더 단위를 사용하려면 옵션(이상)이 필요합니다.

STL 헤더를 헤더 단위로 가져오는 두 가지 방법

STL 헤더를 가져오려면 먼저 헤더 단위로 컴파일해야 합니다. 헤더 단위는 헤더 파일의 이진 표현입니다. 확장이 있습니다 .ifc .

권장되는 방법은 사용하려는 STL 헤더에 대한 기본 제공 헤더 단위가 포함된 정적 라이브러리를 만드는 것입니다. 그런 다음 해당 라이브러리 및 import 해당 헤더 단위를 참조합니다. 이 방법을 사용하면 빌드 속도가 빨라지고 재사용이 향상될 수 있습니다. 이 방법을 사용해 보려면 방법 1: STL 라이브러리 헤더 단위의 정적 라이브러리 만들기를 참조 하세요.

또 다른 방법은 Visual Studio에서 프로젝트에서 STL 헤더 #include 를 검색하고 헤더 단위로 컴파일하고 import 헤더가 아닌 #include 헤더 단위로 컴파일하도록 하는 것입니다. 이 방법은 소스 코드를 변경할 필요가 없으므로 큰 코드베이스가 있는 경우에 유용합니다. 이 방법은 다른 프로젝트에서 빌드된 헤더 단위를 다시 사용할 수 없으므로 정적 라이브러리 접근 방식보다 유연성이 떨어집니다. 그러나 개별 STL 라이브러리를 헤더 단위로 가져올 때 성능 이점이 있습니다. 이 방법을 사용해 보려면 접근 방식 2: 가져올 STL 헤더에 대한 검사 포함을 참조하세요.

방법 1: STL 라이브러리 헤더 단위의 정적 라이브러리 만들기

STL 라이브러리를 헤더 단위로 사용하는 권장 방법은 하나 이상의 정적 라이브러리 프로젝트를 만드는 것입니다. 이러한 프로젝트는 사용하려는 STL 라이브러리 헤더 단위로 구성되어야 합니다. 그런 다음 라이브러리 프로젝트를 참조하여 해당 STL 헤더 단위를 사용합니다. 미리 컴파일된 공유 헤더를 사용하는 것과 비슷하지만 더 쉽습니다.

프로젝트 시스템에서 참조하는 프로젝트가 헤더 단위를 가져올 수 있도록 컴파일러에 적절한 /headerUnit 명령줄 옵션을 자동으로 추가하므로 정적 라이브러리 프로젝트에서 빌드된 헤더 단위(및 모듈)는 프로젝트를 참조하는 데 자동으로 사용할 수 있습니다.

이 방법을 사용하면 특정 헤더의 헤더 단위가 한 번만 빌드됩니다. PCH에서는 사용할 수 없는 헤더 단위의 일부 또는 전부를 가져올 수 있습니다. 헤더 단위는 순서에 따라 포함할 수 있습니다.

다음 예제에서는 헤더 단위와 <vector> 헤더 단위로 <iostream> 구성된 정적 라이브러리 프로젝트를 만듭니다. 솔루션이 빌드되면 다른 C++ 프로젝트에서 이 공유 헤더 단위 프로젝트를 참조합니다. 어디서나 찾을 수 있는 import <iostream>;import <vector>; 경우 해당 라이브러리에 대한 기본 제공 헤더 단위는 헤더를 전처리기로 변환하는 대신 사용됩니다. 동일한 헤더가 여러 파일에 포함된 경우 PCH 파일처럼 빌드 성능이 향상됩니다. 헤더를 포함하는 파일에서 헤더를 반복해서 처리할 필요가 없습니다. 대신 이미 처리된 컴파일된 헤더 단위를 가져옵니다.

STL <iostream><vector>라이브러리를 포함하는 정적 라이브러리를 만들고 다음 단계를 수행합니다.

  1. 빈 C++ 프로젝트를 만듭니다. 이름을 SharedPrj로 지정합니다.
    새 프로젝트 만들기 창에서 사용할 수 있는 프로젝트 유형에서 C++용 빈 프로젝트를 선택합니다.Screenshot that shows creating a new empty C++ project.

  2. 프로젝트에 새 C++ 파일을 추가합니다. 파일의 콘텐츠를 다음으로 변경합니다.

    import <iostream>;
    import <vector>;
    

프로젝트 속성 설정

이 프로젝트의 헤더 단위를 공유하도록 프로젝트 속성을 설정합니다.

  1. Visual Studio 기본 메뉴에서 Project>SharedPrj 속성을 선택하여 프로젝트 속성 페이지 대화 상자를 엽니다.Screenshot that shows settings for Configuration Type and C++ Language Standard.
  2. 구성 드롭다운 목록에서 모든 구성선택한 다음 플랫폼 드롭다운 목록에서 모든 플랫폼을 선택합니다. 이러한 설정은 디버그 또는 릴리스를 위해 빌드하든 관계없이 변경 내용이 적용되도록 합니다.
  3. 프로젝트 속성 페이지 대화 상자의 왼쪽 창에서 구성 속성>일반을 선택합니다.
  4. 구성 형식 옵션을 정적 라이브러리(.lib)로 변경합니다.
  5. C++ 언어 표준을 ISO C++20 표준(/std:c++20) 이상으로 변경합니다.
  6. 프로젝트 속성 페이지 대화 상자의 왼쪽 창에서 구성 속성>C/C++>일반을 선택합니다.
  7. 모듈 종속성에 대한 원본 검사 드롭다운 목록에서 예를 선택합니다. (이 옵션을 사용하면 컴파일러가 헤더 단위에 기본 제공될 수 있는 종속성을 코드에서 검색합니다.) Screenshot that shows the scan module dependencies property setting.
  8. [확인]을 선택하여 프로젝트 속성 페이지 대화 상자를 닫습니다. 주 메뉴에서 빌드>솔루션 빌드를 선택하여 솔루션을 빌드합니다.

헤더 단위 라이브러리 참조

정적 라이브러리에서 헤더 단위로 가져오 <iostream><vector> 하려면 다음과 같이 정적 라이브러리를 참조하는 프로젝트를 만듭니다.

  1. 현재 솔루션이 열려 있는 상태로 Visual Studio 메뉴에서 파일>추가>새 프로젝트를 선택합니다.

  2. 새 프로젝트 만들기 마법사에서 C++ 콘솔 앱 템플릿을 선택하고 다음을 선택합니다.

  3. 새 프로젝트 연습의 이름을 지정합니다. 솔루션 드롭다운을 솔루션추가로 변경합니다. 만들기를 선택하여 프로젝트를 만들고 솔루션에 추가합니다.

  4. 다음과 같이 Walkthrough.cpp 원본 파일의 내용을 변경합니다.

    import <iostream>;
    import <vector>;
    
    int main()
    {
        std::vector<int> numbers = {0, 1, 2};
        std::cout << numbers[1];
    }
    

헤더 단위에는 옵션(이상)이 /std:c++20 필요합니다. 다음 단계를 사용하여 언어 표준을 설정합니다.

  1. 솔루션 탐색기 연습 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성을 선택하여 프로젝트 속성 페이지 대화 상자를 엽니다.Screenshot that shows setting the language standard to the preview version.
  2. 연습 프로젝트 속성 페이지 대화 상자의 왼쪽 창에서 구성 속성>일반을 선택합니다.
  3. C++ 언어 표준 드롭다운에서 ISO C++20 Standard(/std:c++20) 이상을 선택합니다.
  4. [확인]을 선택하여 프로젝트 속성 페이지 대화 상자를 닫습니다.

연습 프로젝트에서 다음 단계를 사용하여 SharedPrj 프로젝트에 대한 참조를 추가합니다.

  1. Walkthrough 프로젝트에서 참조 노드를 선택하고 참조 추가를 선택합니다. 프로젝트 목록에서 SharedPrj를 선택합니다.Screenshot that shows the Add Reference dialog. It's used to add a reference to the Walkthrough project.이 참조를 추가하면 연습 프로젝트의 헤더 단위가 SharedPrj에서 빌드된 헤더 단위 중 하나와 일치할 때마다 import 빌드 시스템에서 SharedPrj에서 빌드한 헤더 단위를 사용합니다.
  2. 확인을 선택하여 참조 추가 대화 상자를 닫습니다.
  3. Walkthrough 프로젝트를 마우스 오른쪽 단추로 클릭하고 시작 프로젝트로 설정을 선택합니다.
  4. 솔루션을 빌드합니다. (사용 기본 메뉴에서 빌드 솔루션을 빌드>합니다.) 실행하여 예상 출력을 생성하는지 확인합니다.1

이 방법은 프로젝트에서 정적 라이브러리 프로젝트를 참조하여 헤더 단위를 다시 사용할 수 있다는 장점이 있습니다. 이 예제에서 정적 라이브러리에는 및 <iostream> 헤더 단위가 <vector> 포함됩니다.

다양한 프로젝트에서 가져오려는 일반적으로 사용되는 STL 헤더를 모두 포함하는 모놀리식 정적 라이브러리 프로젝트를 만들 수 있습니다. 또는 헤더 단위로 가져오려는 STL 라이브러리의 다양한 그룹에 대해 더 작은 공유 라이브러리 프로젝트를 만들 수 있습니다. 그런 다음, 필요에 따라 해당 공유 헤더 단위 프로젝트를 참조합니다.

헤더 단위를 가져오면 컴파일러가 수행해야 하는 작업이 현저하게 줄어들기 때문에 빌드 처리량이 증가하게 됩니다.

사용자 고유의 프로젝트에서 이 방법을 사용하는 경우 해당 프로젝트를 참조하는 프로젝트와 호환되는 컴파일러 옵션을 사용하여 정적 라이브러리 프로젝트를 빌드합니다. 예를 들어 예외 처리를 켜서 정적 라이브러리 프로젝트를 참조하는 프로젝트가 되도록 하려면 /EHsc 컴파일러 옵션으로 STL 프로젝트를 빌드해야 합니다.

/translateInclude 사용

/translateInclude 컴파일러 옵션(C/C++>일반>변환 가져오기프로젝트 속성 페이지 대화 상자에서 사용 가능)을 사용하면 STL 라이브러리가 있는 이전 프로젝트에서 #include 헤더 단위 라이브러리를 더 쉽게 사용할 수 있습니다. 따라서 프로젝트에서 지시문을 import 변경할 #include 필요가 없지만 헤더 단위를 포함하는 대신 가져오는 이점을 얻을 수 있습니다.

예를 들어 프로젝트에 있고 헤더 단위가 포함된 정적 라이브러리를 <vector>참조하는 경우 #include <vector> 소스 코드에서 수동으로 변경할 #include <vector>import <vector>; 필요가 없습니다. 대신 컴파일러는 자동으로 .로 import <vector>;처리됩니다#include <vector>. 이 방법에 대한 자세한 내용은 접근 방식 2: 가져올 STL 헤더에 대한 검사 포함을 참조하세요. 모든 STL 헤더 파일을 헤더 단위로 컴파일할 수 있는 것은 아닙니다. Visual Studio와 함께 제공된 항목에는 header-units.json 헤더 단위로 컴파일할 수 있는 STL 헤더 파일이 나열됩니다. 매크로를 사용하여 동작을 지정하는 헤더는 헤더 단위로 컴파일할 수 없는 경우가 많습니다.

#include 헤더 단위를 참조하지 않는 문은 일반#include으로 처리됩니다.

프로젝트 간 헤더 단위 다시 사용

정적 라이브러리 프로젝트에서 빌드된 헤더 단위는 직접적으로 및 간접적으로 참조하는 모든 프로젝트에서 자동으로 사용할 수 있습니다. 모든 참조하는 프로젝트에서 자동으로 사용할 수 있는 헤더 단위를 선택할 수 있는 프로젝트 설정이 있습니다. 해당 설정은 프로젝트 설정의 VC++ 디렉터리에 있습니다.

  1. 솔루션 탐색기 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성을 선택하여 프로젝트 속성 페이지 대화 상자를 엽니다.
  2. 대화 상자의 왼쪽 창에서 구성 속성>VC++ 디렉터리를 선택합니다.Screenshot that shows public project content properties, like Public Include Directories and All Header Files are Public.

다음 속성은 빌드 시스템에 대한 헤더 단위의 표시 유형을 제어합니다.

  • Public Include Directories 는 참조 프로젝트의 포함 경로에 자동으로 추가되어야 하는 헤더 단위에 대한 프로젝트 디렉터리를 지정합니다.
  • 공용 C++ 모듈 디렉터리 에서는 참조 프로젝트에 사용할 수 있어야 하는 헤더 단위가 포함된 프로젝트 디렉터리를 지정합니다. 이 속성을 사용하면 일부 헤더 단위를 공용으로 만들 수 있습니다. 다른 프로젝트에 표시되므로 여기에 공유하려는 헤더 단위를 배치합니다. 편의상 이 설정을 사용하는 경우 공용 포함 디렉터리를 지정하여 참조 프로젝트의 포함 경로에 공용 헤더를 자동으로 추가합니다.
  • 모든 모듈은 공용입니다. DLL 프로젝트의 일부로 빌드된 헤더 단위를 사용하는 경우 DLL에서 기호를 내보내야 합니다. 모듈 기호를 자동으로 내보내려면 이 속성을 Yes설정합니다.

미리 빌드된 모듈 파일 사용

일반적으로 솔루션 간에 헤더 단위를 다시 사용하는 가장 쉬운 방법은 각 솔루션에서 공유 헤더 단위 프로젝트를 참조하는 것입니다.

프로젝트가 없는 기본 제공 헤더 단위를 사용해야 하는 경우 솔루션에서 가져올 수 있도록 빌드된 .ifc 파일의 위치를 지정할 수 있습니다. 이 설정에 액세스하려면

  1. 기본 메뉴에서 프로젝트 속성을 선택하여 프로젝트>속성 페이지 대화 상자를 엽니다.
  2. 대화 상자의 왼쪽 창에서 구성 속성>C/C++>일반을 선택합니다.
  3. 추가 모듈 종속성에서 참조할 모듈을 세미콜론으로 구분하여 추가합니다. 다음은 추가 모듈 종속성에 사용할 형식의 예입니다.ModuleName1=Path\To\ModuleName1.ifc; ModuleName2=Path\To\ModuleName2.ifcScreenshot showing project Property Pages properties under Configuration Properties, C/C++, General, with Additional Module Dependencies selected.

여러 헤더 단위의 복사본 중에서 선택

동일한 이름 또는 동일한 헤더 파일을 사용하여 여러 헤더 단위를 빌드하는 프로젝트를 참조하는 경우 사용할 헤더 단위를 지정해야 합니다. 예를 들어 다른 컴파일러 설정으로 빌드된 헤더 단위의 버전이 다를 수 있으며 프로젝트 설정과 일치하는 헤더 단위를 지정해야 합니다.

프로젝트의 추가 헤더 단위 종속성 속성을 사용하여 사용할 헤더 단위를 지정하여 충돌을 해결합니다. 그렇지 않으면 어떤 항목이 선택될지 예측할 수 없습니다.

추가 헤더 단위 종속성 속성을 설정하려면 다음을 수행합니다 .

  1. 기본 메뉴에서 프로젝트 속성을 선택하여 프로젝트>속성 페이지 대화 상자를 엽니다.
  2. 대화 상자의 왼쪽 창에서 구성 속성>C/C++>일반을 선택합니다.
  3. 충돌을 해결하기 위해 추가 헤더 단위 종속성에서 사용할 모듈 또는 헤더 단위 파일을 지정합니다. 추가 헤더 단위 종속성에 다음 형식을 사용합니다.Path\To\Header1.h= Path\To\HeaderUnit1.ifc;Path\To\Header2.h= Path\To\ HeaderUnit2.ifcScreenshot that shows the Additional Header Unit Dependencies setting in the project Property Pages dialog.

Important

헤더 단위를 공유하는 프로젝트가 호환되는 컴파일 옵션으로 빌드되었는지 확인합니다. 만들 때 사용한 것과 다른 헤더 단위를 구현할 때 컴파일 옵션을 사용하면 컴파일러가 경고를 표시합니다.

참고 항목

DLL 프로젝트의 일부로 빌드된 헤더 단위를 사용하려면 모든 모듈이 퍼블릭임로 설정합니다.

방법 2: 가져올 STL 헤더를 검사합니다.

STL 라이브러리를 가져오는 또 다른 방법은 Visual Studio에서 프로젝트에서 STL #include 헤더를 검색하고 헤더 단위로 컴파일하도록 하는 것입니다. 그런 다음 컴파일러는 해당 헤더를 포함하지 않고 가져옵니다.

이 옵션은 프로젝트에 여러 파일에 많은 STL 헤더 파일이 포함되거나 빌드 처리량이 중요하지 않은 경우에 편리합니다. 이 옵션은 특정 헤더 파일에 대한 헤더 단위가 한 번만 빌드되도록 보장하지는 않습니다. 그러나 큰 코드베이스가 있는 경우 유용합니다. 사용하는 많은 STL 라이브러리에 대한 헤더 단위의 이점을 활용하기 위해 소스 코드를 변경할 필요가 없습니다.

이 방법은 다른 프로젝트에서 빌드된 헤더 단위를 다시 사용하는 데 적합하지 않으므로 정적 라이브러리 접근 방식보다 덜 유연합니다. 이 방법은 대규모 프로젝트에 적합하지 않을 수 있습니다. 모든 원본에서 문을 검색 #include 해야 하므로 최적의 빌드 시간을 보장하지는 않습니다.

모든 헤더 파일을 헤더 단위로 자동으로 변환할 수 있는 것은 아닙니다. 예를 들어 매크로를 통한 조건부 컴파일에 의존하는 헤더는 헤더 단위로 변환해서는 안 됩니다. 컴파일러가 지정된 경우 /translateInclude 사용하는 STL 헤더에 대한 파일 형식의 header-units.json허용 목록이 있습니다. 헤더 단위로 컴파일할 수 있는 STL 헤더를 결정합니다. 파일이 header-units.json Visual Studio의 설치 디렉터리 아래에 있습니다. 예: %ProgramFiles%\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.30.30705\include\header-units.json. STL 헤더 파일이 목록에 없으면 헤더 단위로 가져오는 대신 정상적으로 #include 처리됩니다. 파일의 header-units.json 또 다른 장점은 빌드된 헤더 단위에서 기호 중복을 방지한다는 것입니다. 즉, 헤더 단위를 컴파일하면 다른 라이브러리 헤더를 여러 번 가져오는 경우 기호가 중복되지 않습니다.

이 방법을 사용해 보려면 두 개의 STL 라이브러리를 포함하는 프로젝트를 만듭니다. 그런 다음, 다음 섹션에 설명된 대로 라이브러리를 포함하는 대신 헤더 단위로 가져오도록 프로젝트의 속성을 변경합니다.

C++ 콘솔 앱 프로젝트 만들기

다음 단계에 따라 두 개의 STL 라이브러리를 포함하는 프로젝트를 만듭니다. <iostream><vector>

  1. Visual Studio에서 새 C++ 콘솔 앱 프로젝트를 만듭니다.

  2. 원본 파일의 내용을 다음과 같이 바꿉니다.

    #include <iostream>;
    #include <vector>;
    
    int main()
    {
        std::vector<int> numbers = {0, 1, 2};
        std::cout << numbers[1];
    }
    

프로젝트 옵션을 설정하고 프로젝트를 실행합니다.

다음 단계에서는 컴파일러가 포함된 헤더를 검색하여 헤더 단위로 변환하도록 하는 옵션을 설정합니다. 또한 컴파일러가 헤더 단위로 처리할 수 있는 헤더 파일을 작성한 import 것처럼 처리 #include 하도록 하는 옵션을 설정합니다.

  1. 기본 메뉴에서 프로젝트 속성을 선택하여 프로젝트>속성 페이지 대화 상자를 엽니다.
  2. 구성 드롭다운 목록에서 모든 구성선택한 다음 플랫폼 드롭다운 목록에서 모든 플랫폼을 선택합니다. 이러한 설정은 디버그 또는 릴리스를 위해 빌드하든 관계없이 변경 내용과 기타 구성을 적용하도록 합니다.
  3. 대화 상자의 왼쪽 창에서 구성 속성>C/C++>일반을 선택합니다.
  4. Scan Sources for Module Dependencies(소스의 모듈 종속성 검색)를 로 설정합니다. 이 설정을 사용하면 호환되는 모든 헤더 파일이 헤더 단위로 컴파일됩니다.
  5. Translate Includes를 Imports to Yes설정합니다. 이 설정은 파일에 나열된 header-unit.json STL 헤더 파일을 헤더 단위로 컴파일한 다음 전처리기를 #include 사용하는 대신 가져옵니다. Screenshot that shows the scan module dependencies property setting in the project Property Pages.
  6. 확인을 선택하여 변경 내용을 저장하고 프로젝트 속성 페이지 대화 상자를 닫습니다.

/std:c++20 헤더 단위를 사용하려면 옵션 이상이 필요합니다. 컴파일러에서 사용하는 C++ 언어 표준을 변경하려면 다음을 수행합니다.

  1. 기본 메뉴에서 프로젝트 속성을 선택하여 프로젝트>속성 페이지 대화 상자를 엽니다.
  2. 구성 드롭다운 목록에서 모든 구성선택한 다음 플랫폼 드롭다운 목록에서 모든 플랫폼을 선택합니다. 이러한 설정은 디버그 또는 릴리스를 위해 빌드하든 관계없이 변경 내용과 기타 구성을 적용하도록 합니다.
  3. 프로젝트 속성 페이지 대화 상자의 왼쪽 창에서 구성 속성>일반을 선택합니다.
  4. C++ 언어 표준 드롭다운 목록에서 ISO C++20 표준(/std:c++20) 이상을 선택합니다.
  5. 확인을 선택하여 변경 내용을 저장하고 프로젝트 속성 페이지 대화 상자를 닫습니다.
  6. 기본 메뉴에서 빌드 솔루션 빌드를 선택하여 솔루션을 빌드>합니다.

솔루션을 실행하여 예상 출력을 생성하는지 확인합니다. 1

이 방법을 사용할지 여부에 대한 기본 고려 사항은 모든 파일을 검색하여 헤더 단위로 빌드할 헤더 파일을 결정하는 데 드는 편리성과 비용 간의 균형입니다.

참고 항목

헤더 단위, 모듈 및 미리 컴파일된 헤더 비교
자습서: 모듈을 사용하여 C++ 표준 라이브러리 가져오기
연습: Visual C++ 프로젝트에서 헤더 단위 빌드 및 가져오기
/translateInclude