작년 프방 수업을 들으면서 m1에서 c++을 사용하게 되는 일이 있었는데 여러 문제가 있었다. 따라서, m1에서 c++을 처음 코딩하는 사람이 환경설정에 고민할 필요없을 정도로 자세하게 써보았다. 볼 사람이 많을지는 모르겠지만 피드백은 항상 환영입니다.
Visual Studio Code는 다양한 extension이 존재하는 아주 훌륭한 코드 편집기다. m1용으로 잘 설치하면 된다. homebrew로도 설치된다. 이 부분은 어디에나 설명이 많아서 생략.
컴파일러를 설치해야 한다. 터미널에 clang++ --version을 통해 컴파일러가 설치되어 있는지 확인한다.
설치되어 있지 않다면 xcode-select --install을 통해 설치하자.
그 다음 C/C++ 지원 extension을 설치한다.
⌘ + ' 는 기억해두면 좋은 단축키다. vsc 설정 단축키인데, 이는 Code > Preferences > Settings와 같다.
c++14던 c++17이던 원하는 버전 쓰면 된다.
vsc에서 폴더 열기 선택해서 폴더 열고 cpp 파일 만들자. 국룰 hello.cpp로 파일명 만들고 이걸 베껴적어보자.
#include <iostream>
using namespace std;
int main()
{
cout << "Hello, World!" << endl;
reutrn 0;
}
이제 코드를 빌드할 건데 밑의 과정을 따라가면 된다.
단, 글 밑의 tasks.json을 베껴쓰자. 절대 사진 그대로 쓰면 안된다. tasks.json의 설명은 나중에 읽고, c++코드를 실행하는 하나의 목표에 집중하자.
cpp 파일을 빌드한다. ⌘ + shift + B 가 단축키다. 터미널 창에 빌드가 성공적이라는 메세지가 뜨면 잘 된 것이다.
cpp 파일 열면 이것저것 추천하는데 사실 나도 그 팩들이 다 뭐하는지 모른다. 그래서 vsc가 추천하는 거 무지성으로 설치한다.
Better Comments는 무시하고 난 저게 깔려있던데 솔직히 뭐하는 건지 모른다. 별 문제 없으면 안 깔아도 될 거 같은데, 난 괜히 설정 바꾸기 싫어서 내버려뒀다.
이거는 디버거 툴 중 하나인데 꼭!!!!!! 다운받자. 백만 다운로드된 그거 맞다.
Code Runner는 미리 입력한 명령을 실행해주는 아주 간편한 툴이다.
cpp를 사진에처럼 말고 밑에 걸로 바꿔써주자.
"cpp" : "cd $dir && clang++ -fdiagnostics-color=always -g $fileName -std=c++14 -o $dirBuild/$fileNameWithoutExt && $dirBuild/$fileNameWithoutExt"
이는 cpp파일에서 code runner를 실행시키면 위의 명령을 실행하겠다는 뜻이다. code runner를 설치하면 웬 화살표 아이콘이 새로 생긴 것을 알 수 있다. 이거 누르면 위의 명령을 실행한다. 위를 잘 살펴보면 1-6, 1-7에서 타입친 명령이 써져있다는 것을 눈치챌 수 있다. 결국, 빌드한 후 바로 프로그램이 실행되도록 code runner를 세팅한것이다.
마지막으로 위에 사진처럼 수정하면 터미널에서 인풋을 받을 수 있으니 저거만 설정해주면 편한 코딩 가능이다.
tasks.json은 CLI환경에서 cpp파일을 컴파일하는 등의 반복적인 작업을 자동화시켜주는 툴들을 vsc 창 내에서 다룰 수 있도록 argument들을 정해주는 파일이라고 생각하면 될 거 같다. tasks.json의 argument들은 Run Build Task로 넘어간다.
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: clang++ build active file",
"command": "/usr/bin/clang++",
"args": [
"-fdiagnostics-color=always",
"-g",
"${fileBasename}", //"*.cpp",
"-std=c++14",
"-o",
"${fileDirname}/Build/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "compiler: /usr/bin/clang++"
}
]
}
C++은 컴파일러 언어기 때문에 코드가 실행되기 전에 반드시 빌드를 해야만한다. 추후에 디버깅을 하기 위해서 컴파일러는 clang++을 사용할것이고, 이는 tasks안의 command를 통해 확인할 수 있다. 솔직히 나머지 값들은 뭘하는지는 모르겠는데 args가 굉장히 중요한 건 확실하다.
위의 사진은 cpp 파일을 빌드했을때의 터미널의 모습이다. 첫째줄에는 label의 값이, 셋째줄부터는 command와 args들이 조합되어서 터미널에 입력된 것을 확인할 수 있다.
-fdiagnotics-color 설정이 없으면 디버깅에 문제가 생겨서 추가했고, -std는 c++의 버전을 선택하는 항이니 17을 쓰고 싶으면 17로 바꿔쓰면 된다.
주목할 점은 -g의 다음줄에 주석처리된 "*.cpp" 다. 현재의 taks 파일은 vsc의 frontmost cpp파일만 실행한다. 백준 문제 풀이를 모아둔 폴더에서 작업 중이라 현재 파일만 실행하도록 했다.
그러나, 나중에는 implement와 interface를 분리하게 되는 일이 분명히 생기는데, 그때는 현재 다루고 있는 main.cpp 파일 하나만 빌드할 것이 아니라 그 파일이 import 하고 있는 다른 cpp, header 파일도 빌드를 해야만 한다. 셸 스크립트와 친숙한 사람은 대충 눈치챘겠지만 (사실 그런 사람이 이 글을 읽을 거 같지는 않다), * 은 아무거나 들어와도 된다는 뜻으로, 주석 처리된 저 부분은 결국 file 확장자가 cpp인 경우, 모두 빌드하라는 뜻이 된다. 즉, 현재 폴더 내에 모든 cpp 파일을 실행하는 명령이다. 그러니, 자신의 상황에 맞게 잘 바꾸면 된다.
m1칩은 기존과는 다른 아키텍쳐를 사용해서 그런지 vsc에서 디버깅이 안 된다. 정말 힘들게 방법들을 찾아다녔고, 결국 방법을 찾아냈다!!
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "lldb",
"request": "launch",
"name": "Debug C/C++",
"program": "${workspaceFolder}/Build/${fileBasenameNoExtension}",
"args": [],
"cwd": "${workspaceFolder}"
}
]
}
앞서 lldb를 설치한 이유가 드디어 나온다. lldb는 소프트웨어 디버거인데, 내 경우엔 이를 통해서만 디버깅이 되었었다. 지금은 이런 설정 없이도 디버깅이 되도록 디버거들이 수정됐을지도 모르겠는데, lldb가 이미 좋은 디버깅 도구라 만족하면서 쓰고 있다.
cpp파일을 디버깅하기 위해서는 우선 빌드를 해야한다. 빌드한 프로그램은 위의 json file의 program과 같은 위치와 이름을 가져야 된다.
빌드를 한 후에, vsc의 디버깅 창으로 넘어가서 저 초록색 화살표 누르면 디버깅이 된다.
c++ 코딩을 하면서 두번째로 짜증났던 점이 코드에 에러가 나면 어디 줄에서 에러가 났는지 말을 하면 될 것을 그냥 segmentation fault를 찍어낸다는 점이었다(첫번째는 문자열. 파이썬으로 코딩을 시작해선지 그냥 c++의 방식에 화가 났다. 물론, 전부 내 미숙함 때문이다.). 디버깅은 에러가 일어난 줄을 표시해주고, 현 상황에서 변수들이 어떤 값을 가지고 있는지 전부 표시해주기 때문에 필수라고 생각한다. 그러니, 복잡하다고 도망가지 말고 꼭!!!! c++ 디버깅 설정을 마치고 편한 코딩하자.
vsc에서 디버깅하는 법은 엘리 코딩에서 잘 설명해주고 있다. 다른 언어긴 하나, 흐름이 똑같으니 들어보면 좋을 거 같다.
5-1. Code runner 단축키
⌘ + shift + p는 vsc에서 가장 중요한 단축키다. 팔레트를 열어주는데 거기다가 Preferences:open keyboard short cuts를 입력하고 엔터 쳐서 열자.
Run code 검색해서 opt + R을 key binging하자. opt + R을 하면 code runner 화살표를 누르는 것과 같은 일이 벌어진다는 뜻이다.
보통 opt 키는 단축키로 안 쓰는 경우가 많아 겹치는 일이 없어서 custom할 때 개인적으로 자주 쓴다.