Visual Studio Code 에서 LLVM/Clang (C/C++) 컴파일
목차
- 앞서...
- Tasks.json
- Launch.json
1. 앞서
웹 상의 많은 자료들은 보통 GNU Compiler Collection 즉, GCC를 이용하여 컴파일을 할 수 있도록 설정되어 있는 자료들이 많습니다.
따라서, 'LLVM/Clang 이 무엇인지' 에 대해서는 크게 다루지 않고, 넘어가도록 하겠습니다.
굳이 GCC나 Clang을 따로 구분하지 않아도 명령어와 옵션 등을 거의 비슷하게 사용할 수 있기 때문이기도 하고, 운영체제 별로 이미 설치되어 있거나 기본적으로 지원하는 컴파일러가 있기 때문에 크게 신경을 쓰지 않았을 수 있습니다.
Windows에서는 Visual Studio를 설치하면 MSVC가 설치되고, 리눅스에서는 GCC가 기본적으로 배포판 설치 시에 함께 설치되며, Apple MacOS는 Apple LLVM/Clang 이 기본적으로 설치되어 있습니다.
따라서, 굳이 컴파일러를 고민하면서 선택하는 것이 아니라면, 또, 프로그래밍에 입문하는 사람이라면 굳이 '컴파일러가 무엇인가?' 에 대한 고민을 하지 않고 시작할 수도 있죠.
저는 지식의 지옥에 빠져버려서, '컴파일러란 무엇인가?', '툴체인이란 무엇인가?' 이런 것들에 함께 빠져버려서 그만..... 영겁의 시간을 허비하는, 허비라고 표현하기에는 배우는 지식이 있지만, 프로그래밍 실력을 늘리기에는 너무나 많은 허비를 하게 되었습니다.
"아직 프로그래밍 제대로 시작도 안했으면서 쓸때없는 짓거리를 하고 있냐?" 라는 소리를 듣기는 하지만요. 궁금한 건 못 참겠습니다.
그래서, 저는 Windows와 Linux에서 LLVM/Clang을 메인 컴파일러로 사용할 수 있도록 Visual Studio Code 설정 파일을 공유하고자 합니다.
주의)
이 내용은 LLVM/Clang 18.1.6 버전에서 테스트 되었습니다.
해당 내용은 LLVM/Clang 버전에 따라 달라질 수 있습니다.
(특히, 버전에 따라 언어 표준에 대한 내용이 달리질 수 있습니다.)
Windows에서 Clang 컴파일러를 사용하기 위해서는 Visual Studio의 C++ 부분이 설치되어 있어야 하며,
Visual Studio Code의 CodeLLDB 확장도 함께 설치되어 있어야 합니다.
(Windows에서는 Clang이 프론트엔드를 담당하고, MSVC 빌드 툴이 백엔드를 담당하기 때문입니다.)
2. Tasks.json
Terminal -> Configuration Tasks 작성 시, create tasks.json 내용
(기본 내용은 무시하고 해당 내용으로 교체합니다.)
Windows Visual Studio Code, Tasks.json
{
"version": "2.0.0",
"runner": "terminal",
"type": "shell",
"echoCommand": true,
"presentation": {
"reveal": "always"
},
// C Compile
"tasks": [
{
"label": "Save and Compile for C",
"command": "C:\\Program Files\\LLVM\\bin\\clang.exe", // 설치한 LLVM/Clang 의 bin 폴더 경로를 입력
"args": [
"-std=c23", // 사용하는 C 표준을 선택 (c89, c99, c11, c17, c23)
"-fdiagnostics-color=always",
"-fcolor-diagnostics",
"-fansi-escape-codes",
"-g",
"-v", // 컴파일 옵션
"-O2", // 컴파일 최적화 옵션
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "C:\\Program Files\\LLVM\\bin"
},
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": [],
"detail": "Compiler : Clang | C:/Program Files/LLVM/bin/clang.exe"
},
// C++ Compile
{
"label": "Save and Compile for C++",
"command": "C:\\Program Files\\LLVM\\bin\\clang++.exe", // 설치한 LLVM/Clang 의 bin 폴더 경로를 입력
"args": [
"-std=c++23", // 사용하는 C++ 표준 선택 (c++98, c++11, c++14, c++17. c++20, c++23, c++23)
"-fdiagnostics-color=always",
"-fcolor-diagnostics",
"-fansi-escape-codes",
"-g",
"-v", // 컴파일 옵션
"-O2", // 컴파일 최적화 옵션
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "${fileDirname}"
},
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": "$clang++",
"detail": "Compiler : Clang++ | C:/Program Files/LLVM/bin/clang++.exe"
},
{
"label": "execute",
"command": "cmd",
"group": "test",
"args": ["/C", "${fileDirname}/${fileBasenameNoExtension}.exe"]
}
]
}
Linux, Visual Studio Code, Tasks.json
{
"version": "2.0.0",
"runner": "terminal",
"type": "shell",
"echoCommand": true,
"presentation": { "reveal": "always" },
"tasks": [
// C Compile
{
"label": "Save and C Compile",
"command": "/usr/bin/clang",
"args": [
"-std=c23", // 사용하는 C 표준을 선택 (c89, c99, c11, c17, c23)
"-fdiagnostics-color=always",
"-fcolor-diagnostics",
"-fansi-escape-codes",
"-g",
"-v", // 컴파일 옵션
"-O2", // 컴파일 최적화 옵션
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "/usr/bin/"
},
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": "$clang",
"detail" : "Compiler : Clang | /usr/bin/clang"
},
{
// C++ Compile
"label": "Save and Compile for C++",
"command": "/usr/bin/clang++",
"args": [
"-std=c++2b", // 사용하는 C++ 표준 선택 (c++98, c++11, c++14, c++17. c++20, c++23, c++23)
"-fdiagnostics-color=always",
"-fcolor-diagnostics",
"-fansi-escape-codes",
"-g",
"-v", // 컴파일 옵션
"-O2", // 컴파일 최적화 옵션
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": "$clang++",
"detail" : "Compiler : Clang++ | /usr/bin/clang++"
},
{
// Linux Binary Execute
"label": "execute",
"group": "test",
"command": "cd ${fileDirname} &&./${fileBasenameNoExtension}"
}
]
}
3. Launch.json
(기본 내용은 무시하고 해당 내용으로 교체합니다.)
Windows, Visual Studio Code, Launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Clang Build and Debug Active File",
"targetArchitecture": "x86_64",
"type": "lldb",
"request": "launch",
"program": "${workspaceFolder}/${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "lldb"
},
]
}
Linux, Visual Studio Code, Launch.json
{
// IntelliSense를 사용하여 가능한 특성에 대해 알아보세요.
// 기존 특성에 대한 설명을 보려면 가리킵니다.
// 자세한 내용을 보려면 https://go.microsoft.com/fwlink/?linkid=830387을(를) 방문하세요.
"version": "0.2.0",
"configurations": [
{
"name": "Clang Build and Debug Active File",
"targetArchitecture": "x86_64",
"type": "lldb",
"request": "launch",
"program": "${workspaceFolder}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "lldb"
}
]
}