M1 VSCode에서 C++의 'bits/stdc++.h' 헤더 파일 불러오기 오류 해결 과정

2024. 9. 4. 16:28·기타

bits/stdc++.h란?

C++ 표준 라이브러리의 여러 헤더 파일들을 한꺼번에 포함하는 비표준 헤더 파일입니다. 주로 코테에서 코드 작성 시간을 단축하기 위해 사용됩니다. 이 헤더 파일은 모든 c++ 표준 헤더 파일을 포함하기 때문에, 개발자가 여러 개의 헤더 파일을 일일이 #include할 필요 없이 한 번에 모든 표준 라이브러리를 사용할 수 있어 코드 작성 시간을 단축해주고, 헤더를 잘못 가져오는 등의 실수를 방지 때문에 유용하게 쓰입니다

비공식 헤더 파일이므로, GCC 컴파일러에서만 기본적으로 제공됩니다. Clang이나 MSVC 같은 다른 컴파일러에서는 이 헤더 파일이 기본적으로 포함되지 않으며, 직접 생성해야 사용 할 수 있습니다. mac의 경우 clang 을 사용하여 cpp파일을 컴파일하므로 역시 직접 추가하여 사용해야합니다. 

 

 

bits/stdc++.h를 직접 추가하여 사용하기

보통 clang 이 설치된 위치에 include 폴더 내부에서 bits 폴더를 만들고 그 안에 stdc++.h 파일을 생성합니다. 

그리고 그 파일 안에 c++의 표준 헤더 파일들을 넣어둡니다. 이를 통해 한번에 모든 c++ 표준 헤더 파일을 가져와서 사용할 수 있게 해주는 bits/stdc++.h 헤더파일이 완성됩니다.

 

문제 상황

C++ 코드를 작성할 때 #include <bits/stdc++.h> 사용 시 다음과 같은 오류가 발생했습니다.

fatal error: 'bits/stdc++.h' file not found

 

 

컴파일러가 bits/stdc++.h파일을 못찾고있는 것 입니다

 

여러군데 서치를 해본 결과, 다른 분들은 clang 설치 경로가 /Library/Developer/CommandLineTools/usr/include 인데, 저는 root 권한으로도 수정할 수 없는 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain 경로에 clang이 설치되어 있었습니다. 이 경로에는 sudo를 사용해도 파일을 추가할 수 없어서, 다른 방법이 필요했습니다

 

 

해결 방법

가장 안전한 방법을 선택하고자 대체 경로(= 임의의 위치에 bits/stdc++.h 헤더 파일을 만듦. 추후 설정을 통해 clang이 이 파일을 가져와서 사용하도록 함)를 사용하기로 했습니다. bits/stdc++.h는 표준 헤더 파일이 아니므로 직접 파일을 추가하고, 그 파일을 컴파일러가 찾을 수 있도록 대체 경로를 설정하는 방법을 사용했습니다. 이를 위해 my_include라는 폴더를 만들고, VSCode에서 이를 참조하도록 설정에서 경로를 추가했습니다.

1. 대체 경로에 bits/stdc++.h 헤더 파일 추가

  • 먼저, 홈 디렉터리(cd /Users/유저이름) 에 my_include라는 폴더를 만들고, 그 안에 bits라는 폴더를 생성합니다
mkdir -p ~/my_include/bits
  • bits/stdc++.h 파일을 생성하고, 인터넷에서 제공되는 파일 내용을 복사하여 붙여 넣습니다
touch ~/my_include/bits/stdc++.h

bits/stdc++.h 파일내용은 아래 블로그에서 다운받을 수 있습니다

https://miniolife.tistory.com/11

 

Visual Studio에서 <bits/stdc++.h> 사용하기

처음에 알고리즘 문제를 풀다보면 귀찮?까다로운? 점이 include일 것이다. 어떤 헤더 파일에 어떤 함수가 들어있는지도 익숙하지 않고, 컴파일러는 include를 하라고 오류를 뱉어댄다. 어느 헤더 파

miniolife.tistory.com

 

 

2. VSCode 설정 파일 수정

c_cpp_properties.json 설정

- c_cpp_properties.json에서 includePath에 대체 경로를 추가하여, IntelliSense가 이 경로를 참조할 수 있도록 설정했습니다.

- vscode에서 command + shift + P를 눌러 **C/C++: Edit Configurations(JSON)** 을 선택하여 파일을 열 수 있습니다.

{ 
  //c_cpp_properties.json

  "configurations": [
    {
      "name": "Mac",
      "includePath": ["${workspaceFolder}/**", "~/my_include"],
      "defines": [],
      "macFrameworkPath": [
        "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks"
      ],
      "compilerPath": "/usr/bin/clang",
      "intelliSenseMode": "macos-clang-arm64"
    }
  ],
  "version": 4
}
 
이렇게하면 vscode가 컴파일할 때 ~/my_include 경로를 참조하도록 하여 bits/stdc++.h 파일을 찾을 수 있게됩니다! 

 

c_cpp_properties.json 파일은 쉽게말해서 프로그램이 코드를 이해하고, 코드에 필요한 파일을 찾을 수 있도록 필요한 정보를 적어둔 규칙서입니다. 

 

includePath 옵션 : 프로젝트에서 사용해야하는 헤더 파일의 경로를 지정해둡니다. 그리고 컴파일시, 컴파일러와 IntelliSense(= 코드 자동 완성, 문법 검사를 해주는 도구)가 #include 지시문을 만났을 때, 헤더 파일을 찾을 수 있는 경로를 알려주는 역할 입니다.

 

"${workspaceFolder}/**" : 프로젝트 폴더 내의 모든 파일을 참조하여 헤더 파일을 찾도록 합니다

=> 즉 clang 컴파일러에 있는 시스템 경로에 있는 c++표준 헤더 파일을 찾아서 사용하는 것입니다. 그렇기 때문에 우리가 기존의 c++ 표준 헤더 사용할 때에는 따로 헤더 파일을 일일이 추가하지 않아도 사용가능했던 것입니다. 이 속성은 기본값으로 포함되어있는 속성입니다.

  • ${workspaceFolder} = 현재 작업 중인 프로젝트 폴더의 루트 경로 
  • /** = 모든 하위 폴더, 파일을 의미함

 

tasks.json 파일 설정
- 컴파일 시 "-I" 옵션을 추가해 컴파일러가 대체 경로에서 헤더 파일을 찾도록 설정했습니다. 
- tasks.json 파일이 없는 경우 직접 생성해야 합니다. 만드는 방법은 다음 블로그에서 참조하였습니다.
 
https://junekkk.tistory.com/21
 

[VSCode] macOS에서 Visual Studio Code로 C/C++ 코딩하기(2) - 디버깅을 위한 tasks.json, launch.json 설정

지난글에서는 VSCode에서 C++ 코드를 '실행(Run)'만 할 수 있는 설정을 했다. [VSCode] macOS에서 Visual Studio Code로 C/C++ 코딩하기(1) - Extension 설치 MacOS에서 Windows의 Visual Studio같은 IDE는 대표적으로 XCode가

junekkk.tistory.com

 

{ //tasks.json
  "tasks": [
    {
      "type": "cppbuild",
      "label": "C/C++: g++ build active file",
      "command": "/usr/bin/g++",
      "args": [
        "-I",
        "~/my_include",
        "-fdiagnostics-color=always",
        "-g",
        "${file}",
        "-o",
        "${fileDirname}/${fileBasenameNoExtension}"
      ],
      "options": {
        "cwd": "${fileDirname}"
      },
      "problemMatcher": ["$gcc"],
      "group": {
        "kind": "build",
        "isDefault": true
      },
      "detail": "Task generated by Debugger."
    }
  ],
  "version": "2.0.0"
}

"-I" 옵션: 이 옵션은 위에서 언급했듯이 컴파일러가 추가적인 헤더 파일을 찾을 경로를 알려주는 역할을 합니다.

저는 ~/my_include 경로(내가 만든 폴더)를 참조하게 했습니다.

 

 

번외로..

  • bits/stdc++.h는 비표준 헤더 파일이므로, 가능한 경우 표준 라이브러리 헤더 파일들을 직접 포함하는 것이 좋다고 한다.
  • bits/stdc++.h가 많은 헤더 파일을 포함하고 있기 때문에, 컴파일 시간이 길어지게 된다.
  • bits/stdc++.h를 따로 설정해두지 않은 환경에서는 맨 위와 같은 오류가 뜨게 될 것이다. _ 즉 호환성 문제가 존재한다.
  • 무지성 쓰는걸 비판하는 외국 개발자들의 글을 봤다. 물론 코테에서는 시간싸움이기 때문에 가능하면 이 헤더를 잘 활용하는 것이 좋겠지만, 그 외의 경우에는 별로 필요한 헤더도 없는데 괜히 습관적으로 bits/stdc++.h를 써서 컴파일 시간도 늘리고 메모리도 불필요하게 사용하는 일은 없도록 해야겠다. 

'기타' 카테고리의 다른 글

python은 왜 가상환경을 사용할까 (python과 javascript 간단히 비교해보기)  (2) 2025.01.03
깃허브 협업 방식 정리  (1) 2023.12.20
mac m1 tensorflow 설치 중 conda python 버전 관련 에러 해결법  (2) 2023.02.28
'기타' 카테고리의 다른 글
  • python은 왜 가상환경을 사용할까 (python과 javascript 간단히 비교해보기)
  • 깃허브 협업 방식 정리
  • mac m1 tensorflow 설치 중 conda python 버전 관련 에러 해결법
c_jm
c_jm
  • c_jm
    c_jm
    c_jm

    🎋 어제보다 발전한 오늘

  • 전체
    오늘
    어제
    • 분류 전체보기 (35)
      • 프로젝트 (5)
      • 백준 문제풀이 (19)
      • 프로그래머스 문제풀이 (4)
      • 공부 (1)
      • 문제 해결 (2)
      • 기타 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    jquery
    docker-compose.yml
    다크모드
    docker-compose
    글자색
    nginx
    html
    docker
    코드블럭
    리버스 프록시 서버
    티스토리 다크모드
    reverse proxy
    도커
    도커컴포즈
    리버스 프록시
    백준 #1152 #c++
    홈서버
    인라인 css
    복붙
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
c_jm
M1 VSCode에서 C++의 'bits/stdc++.h' 헤더 파일 불러오기 오류 해결 과정
상단으로

티스토리툴바