g++ 11에서 C++20 헤더 단위 사용하기

Twitter icon류광, 2021-09-18 19:09
g++ 11도 C++20 헤더 단위 기능을 지원합니다.

이전 글 Visual Studio 2019에서 C++20 헤더 단위 사용하기의 GCC 버전입니다. 헤더 단위(header unit)에 관한 설명은 이전 글에 있으니 생략합니다.

예제 역시 이전 글과 동일하지만, 편의를 위해 다시 제시합니다. 목표는 다음과 같은 C++ 프로그램을 g++ 11로 성공적으로 빌드해서 실행하는 것입니다.

main.cpp

#include <iostream>
import <vector>;      // (1)
import "myheader.h";  // (2)

int main() {
    std::vector vec{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    std::cout << "get_size(vec): " << get_size(vec) << "\n";
}

myheader.h

#pragma once
auto get_size(auto obj) { return obj.size(); }

g++ 11 버전 현재, 헤더 단위를 사용하려면 메인 프로그램을 컴파일하기 전에 먼저 import되는 헤더들을 일일이 컴파일해 주어야 합니다. 이번 예제는 사용자 정의 헤더 하나와 표준 헤더 하나를 사용합니다. 우선, 사용자 정의 헤더를 헤더 단위를 위해 컴파일하려면 모듈 기능을 위한 -fmodules-ts와 옵션과 링크 없이 컴파일만 하기 위한(메인 프로그램이 아니므로) -c 옵션, 그리고 C++20 기능을 위한 -std=c++20 옵션[1]이 필요합니다.

$ g++ -std=c++20 -fmodules-ts -c myheader.h

표준 헤더를 컴파일하려면 앞의 옵션에 -x c++-system-header 옵션을 추가해야 합니다.

$ g++ -std=c++20 -fmodules-ts -c -x c++-system-header vector  

이제 소스 코드를 컴파일하는 데 필요한 재료가 모두 준비되었습니다.[2] 이제 -c 없이 소스 코드를 컴파일하면 됩니다. 필요합니다.

$ g++ -std=c++20 -fmodules-ts main.cpp -o main

이렇게 하면 main(또는 main.exe)이라는 실행 파일이 만들어집니다.

참고로, 이 표준 헤더의 헤더 단위는 표준 라이브러리 모듈이 아닙니다. 표준 라이브러리 모듈은 C++23 또는 그 이후에 추가될 예정인데요. 관련 제안서 P0581r0에 따르면 표준 라이브러리 모듈은 import <헤더>;가 아니라 import std.???; 형태로 사용하는데, 표준 헤더마다 std.헤더가 있는 것이 아니라 이를테면 <new>, <exception> 등을 std.fundamental로 묶고, <iostream>, <locale> 등을 std.io로 묶는 등 기능별, 성격별로 좀 더 큰 모듈을 두는 방식입니다.


  1. 헤더 단위 자체는 -fmodules-ts만 있으면 되는 것으로 보입니다. 그러나 헤더 단위를 사용하는 코드는 다른 C++20 기능도 사용할 가능성이 크므로, 그냥 -std=c++20를 기본으로 붙이는 게 현실적일 것입니다. 실제로 myheader.h는 C++20의 기능 중 하나인 함수 매개변수에 대한 auto를 사용하기 때문에 -std=c++20이 필요합니다. 

  2. 참고로, 컴파일된 헤더들은 현재 디렉터리의 gcm.cache 디렉터리 어딘가에 존재합니다. 

태그: 프로그래밍 C++ C++20

comments powered by Disqus