HOWTO · C++
C++ 포함 경로: 헤더 검색 구성
C++ 포함 경로가 컴파일러가 헤더를 찾는 데 어떻게 도움이 되는지 알아보고, 컴파일러 플래그, IDE 설정 또는 Makefile로 프로젝트 헤더 디렉터리를 구성하세요.
이 페이지의 내용
포함 경로는 #include 지시문에서 이름이 지정된 헤더를 확인할 때 C++ 컴파일러가 고려하는 디렉터리입니다. 소스 파일이 컴파일러가 이미 검색하는 위치에 없는 헤더를 포함하는 경우, 프로젝트의 헤더 디렉터리를 빌드 구성에 추가하세요. 지시문은 소스 코드에 속하고, 포함 경로는 컴파일러 또는 빌드 설정에 속합니다.
C++ 포함 경로란
프로젝트는 선언을 헤더 디렉터리에, 구현을 소스 파일에 유지할 수 있습니다. 아래 Bash 예제의 임시 프로젝트 디렉터리에는 tmp_dir/ → include/message.h와 src/main.cpp라는 구성이 들어 있습니다.
main.cpp에 #include <message.h>가 들어 있으면, 컴파일러는 include/가 검색 디렉터리라는 것을 알아야 합니다. 포함 경로는 헤더의 복사본이 아니며, 그 내용을 변경하지도 않습니다. 포함을 처리하는 동안 컴파일러가 어디를 찾을 수 있는지를 알려줄 뿐입니다. 시스템 및 도구 체인 헤더도 컴파일러와 빌드 환경이 구성한 위치를 통해 찾습니다.
C++ 포함 경로를 구성하는 방법
사용하는 빌드에 맞는 설정을 선택하세요. 헤더 디렉터리와 그 경로를 로컬 빌드, IDE 구성, 자동화 전반에서 일관되게 유지하세요.
컴파일러 플래그
GCC 또는 호환 컴파일러에서는 -I가 헤더 검색 구성에 디렉터리를 추가합니다. 이 자체 완결형 Bash 예제는 임시 디렉터리에 작은 프로젝트를 만들므로, 어떤 작업 디렉터리에서든 실행할 수 있습니다.
tmp_dir=$(mktemp -d)
trap 'rm -rf "$tmp_dir"' EXIT
mkdir -p "$tmp_dir/include" "$tmp_dir/src"
cat > "$tmp_dir/include/message.h" <<'HEADER'
#pragma once
#define MESSAGE "Hello from the project header"
HEADER
cat > "$tmp_dir/src/main.cpp" <<'SOURCE'
#include <iostream>
#include <message.h>
int main() {
std::cout << MESSAGE << '\n';
}
SOURCE
g++ -I"$tmp_dir/include" "$tmp_dir/src/main.cpp" -o "$tmp_dir/app"
"$tmp_dir/app"
Hello from the project header
-I 옵션은 헤더 파일 이름이 아니라 헤더가 들어 있는 디렉터리를 받습니다. 여기서는 컴파일러가 src/main.cpp를 받고 -o로 실행 파일을 임시 디렉터리에 씁니다. Microsoft C++(cl)를 사용할 경우 대신 /I 뒤에 디렉터리를 붙이세요. 플래그 구문은 컴파일러에 따라 다릅니다.
IDE 프로젝트 설정
Visual Studio에서는 C/C++ 포함 옵션 아래의 프로젝트 Additional Include Directories 설정에 헤더 디렉터리를 추가합니다. 속성 페이지의 정확한 레이블은 Visual Studio 버전과 프로젝트 유형에 따라 다를 수 있습니다. 설정은 Debug 및 x64와 같이 빌드하는 구성과 플랫폼에 적용하세요. 경로의 이식성을 유지하는 데 도움이 된다면 프로젝트의 디렉터리 변수를 사용하세요. 다른 IDE도 동등한 컴파일러 또는 프로젝트 포함 디렉터리 설정을 제공합니다. 활성 빌드 구성이 그것을 사용하는지 확인하세요.
Makefile
컴파일러 플래그를 Makefile의 컴파일 플래그에 넣어 각 소스 컴파일이 그것을 받도록 하세요. 예를 들어, 관련 설정은 CXXFLAGS += -Iinclude로 쓸 수 있습니다. 빌드 규칙은 소스 파일을 컴파일할 때 $(CXXFLAGS)를 사용해야 합니다. 선택한 컴파일러가 플래그를 결정합니다. Microsoft cl을 호출하는 Makefile은 대신 /Iinclude가 필요합니다. 이것은 구문 예시이며, 완전한 Makefile도 아니고 실행된 빌드도 아닙니다.
C++ 헤더 검색의 작동 방식
#include 지시문은 전처리기에 이름이 지정된 헤더를 처리하라고 요청합니다. 고려되는 위치는 지시문의 형태, 그것을 포함하는 파일, 컴파일러 옵션, 구현에 따라 다릅니다. 모든 컴파일러가 동일한 순서로 보편적인 목록을 검색하거나 프로젝트의 상위 디렉터리를 자동으로 확인한다고 가정하지 마세요.
헤더를 찾을 수 없을 때는 철자와 대소문자를 확인한 뒤, 구성된 디렉터리가 해당 파일을 포함하는 디렉터리가 맞는지 확인하세요. 플래그 또는 IDE 속성이 빌드 중인 구성의 컴파일러 호출에 도달하는지 확인하세요. 헤더가 다른 헤더에서 포함되는 경우, 포함하는 파일의 위치와 컴파일러의 문서화된 규칙을 고려하세요. 상세 빌드나 검색 경로를 출력하는 컴파일러 옵션은 어떤 구성이 활성화되어 있는지 보여주는 데 도움이 될 수 있습니다. 사용 가능한 진단 명령은 도구 체인에 따라 다릅니다.
#include "..."와 #include <...>의 차이
따옴표 형태인 #include "message.h"는 보통 포함하는 파일의 디렉터리를 먼저 검색한 뒤, 구현의 추가 검색 규칙을 따릅니다. 꺾쇠괄호 형태인 #include <message.h>는 구현의 구성된 검색 위치를 사용합니다. 나머지 정확한 검색 동작은 구현이 정의하므로, 순서가 중요할 때는 컴파일러 문서를 참조하세요.
이 형태들은 “사용자 지정” 헤더와 “표준” 헤더를 엄격히 구분하는 레이블이 아닙니다. 프로젝트 헤더는 그 디렉터리가 구성되어 있으면 위의 예와 같이 꺾쇠괄호를 사용할 수 있습니다. 따옴표 형태는 구현의 조회 규칙에 따라 도달 가능한 모든 헤더를 이름 지을 수 있습니다. 프로젝트의 관행에 맞는 형태를 선택하고, 컴파일러의 구성된 경로가 여전히 이름이 확인되는지를 결정한다는 것을 이해하세요.