맥 visual studio로는 C++ 개발을 할 수 없습니다. 닷넷밖에 못합니다. 좀 거지같습니다.

꿩대신 닭으로 vscode로 C++ 개발환경을 세팅해보겠습니다.

 

맥 vscode C++ 세팅 방법

먼저 clang, lldb가 설치되어 있어야 합니다 (디버그 안할거면 lldb 없어도 상관X)

맥에는 기본적으로 설치되어 있으니 패스하겠습니다

다음으로는 C/C++ 확장을 설치합니다.

그 다음, code runner 확장도 설치합니다.

이걸 설치하는 이유는, C/C++ 확장 지원이 매우 거지같기 때문입니다

(ex. "Run without debugging" 기능 추가해달라고 2017년에 이슈가 올라왔으나 3년 넘게 진전이 없음. github.com/microsoft/vscode-cpptools/issues/1201)

이건 옵션인데, Output 패널이 아닌 Terminal에서 코드가 실행되게 하려면, 설치한 뒤 Settings에서 Code-runner의 "Run In Terminal" 설정을 체크해줍니다.

settings.json을 열어서 code-runner.executorMap을 위와 같이 설정합니다.

기본값은 g++이면서 std 버전이 들어가 있지 않기 때문에 std=c++17 옵션을 넣어 줘야 합니다.

맥에서는 사실 g++이 clang++의 짭 링크이기 때문에 안바꿔도 상관은 없으나 혼란스러울 수 있으니 그것도 같이 수정해줍니다.

그 다음, cpp 프로젝트를 적당히 만들고 난 뒤 Terminal - Configure Default Build Task로 들어갑니다

여기선 clang++을 선택해줍니다

그럼 이렇게 tasks.json 파일이 생성됩니다. 빌드 + 디버그할 때는 이 설정을 사용하게 되고, 인텔리센스도 이 tasks.json 파일에 기반해 동작합니다.

중간에 args 부분에 "-std=c++17"처럼 c++ 버전을 입력해줘야 최신 문법을 사용할 수 있습니다.

 

자 이제 세팅은 거의 끝났습니다. 디버그 세팅을 해봅시다

F5를 눌러서 Debugging을 실행합니다

Select Environment -> C++(GDB/LLDB) 선택합니다

뭔 차이인지 모르겠는데 적당히 clang++중에 하나 골라줍니다.

launch.json이 생성됐고 딱히 수정할 건 없습니다.

⚠️ 여기서 주의할 점은 launch.json의 preLaunchTask와 tasks.json에서 task의 label이 일치해야 한다는 점입니다. 만약 뭔가 안되면 이걸 확인해주세요

 

실행 및 디버그

#include <iostream>
#include <vector>
#include <string>
#include <cstdio>

using namespace std;


int main() {
	vector<string> vec {"abc", "def", "ghi"};

	if (const auto it = find(begin(vec), end(vec), "abc");
		it != end(vec)) {
		*it = "$$$";
	}

	for (const auto& s: vec) {
		cout << s << "\n";
	}

	return 0;
}

자 이제 c++17 문법이 들어간 cpp 파일을 만들어서 실행시켜봅시다

 

Cmd+Shift+P - Run By Language - cpp 선택한 다음, Option+Control+n(>Run Code)으로 코드를 빌드 + 실행 할 수 있습니다.

 

디버그를 하려면 breakpoint를 찍고, F5를 누르면 됩니다.

주의할 점은 실행파일이 Desktop, Document 등의 영역에 있으면 디버그를 할 때마다 권한을 요구하는 매우 귀찮은 일이 발생하니, 그냥 홈 디렉토리나 그런 곳에 옮겨두는게 좋습니다.

 

후.. 참 손이 많이 가네요. 어쨌거나 잘 동작합니다

 

m1 mac의 경우

m1 맥(apple silicon arm64 architecture) 같은 경우, 빌드와 실행은 잘 되지만 디버그는 안됩니다. 왜냐면 vscode-cpptools에서 아직 지원하지 않기 때문입니다...

그럼 디버그를 포기해야 하느냐? 방법이 있습니다.

먼저 CodeLLDB extension을 설치합니다.

그 다음 launch.json에서 "type": "lldb"로 수정해줍니다. 원래는 "cppdbg"로 되어 있었을 겁니다.

자 이렇게 하면 m1 맥에서도 c++ 디버거를 사용할 수 있습니다.

 

 

+ cpp 파일이 여러개일 때

위 설정들은 main이랑 여러 구현부가 main.cpp 하나에 들어가있을 때만 세팅한건데요, 왜냐면 저는 최근에는 알고리즘 문제풀 때 빼고는 C++을 쓰지 않기 때문에 이걸로 족하기 때문입니다

만약 구현부가 여러파일에 나눠져 있다면 설정파일을 좀 수정해줘야 합니다. main 파일 하나만 컴파일하면 링크 에러가 나옵니다.

1. settings.json -> code-runner.executorMap에서 $fileName 부분을 *.cpp로 바꿔줍니다

이렇게 하면 코드러너로 실행시킬 때 cpp파일을 전부 포함해 컴파일합니다

2. tasks.json args에 ${file} 대신 ${fileDirname}/**.cpp 로 수정해줍니다. (hpp 파일 있으면 그것도 추가해줍니다)

이렇게 하면 디버그도 정상 동작합니다

반응형
  1. settings.json 2021.07.28 13:51 댓글주소 수정/삭제 댓글쓰기

    좋은글 감사합니다! 혹시 settings.json의 전체코드를 알 수 있을까요? 저랑 좀다른거같아서ㅜㅜ

  2. hchoi 2021.09.03 15:37 댓글주소 수정/삭제 댓글쓰기

    안녕하세요. c++을 이제 막 공부하기 시작한 대학생입니다. 좋은 글 적어주셔서 감사드립니다.
    m1 mac을 쓰고 있고, 똑같이 따라했는데도 auto와 같은 c++11 이후의 문법들을 사용할 수 없어서 댓글 달아봅니다.

    //arrfupt.cpp
    #include <iostream>
    const double* f1(const double*, int);
    int main()
    {
    using namespace std;
    auto p1 = f1;
    }
    를 실행시키면 컴파일 에러가 뜨면서

    /usr/bin/clang++ -std=c++17 -g /Users/사용자명/Documents/code_training/cpp/chap07/arrfupt.cpp -o /Users/사용자명/Documents/code_training/cpp/chap07/arrfupt
    Undefined symbols for architecture arm64:
    "f1(double const*, int)", referenced from:
    _main in arrfupt-cebcf8.o
    ld: symbol(s) not found for architecture arm64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    와 같은 에러가 발생합니다. 오랫동안 고민하고 있고 검색도 많이 해봤지만 해결될 기미가 없어 답답한 마음에 댓글 남겨봅니다.

    • vince joe 2021.09.03 16:08 신고 댓글주소 수정/삭제

      컴파일할때 f1 구현부 들어가있는 파일이 빠져서 링크에러가 나오는 겁니다.

      executorMap 부분에서 $fileName 말고 *.cpp로 바꾸세요

      글 하단에 관련 내용도 추가했습니다

  3. hchoi 2021.09.03 16:32 댓글주소 수정/삭제 댓글쓰기

    정말정말 감사드립니다. 덕분에 해결되었습니다.

  4. smiwadler 2021.10.02 08:45 신고 댓글주소 수정/삭제 댓글쓰기

    와 대박 vscode에서 cpp실행하려고 며칠 고생했는데 이 글 보고 바로 성공했습니다ㅜㅜ 정말 감사해요

  5. 천사친구 2021.10.02 22:50 신고 댓글주소 수정/삭제 댓글쓰기

    도움 얻고 갑니다.
    감사합니다.

  6. 이노키_ 2021.11.15 20:07 신고 댓글주소 수정/삭제 댓글쓰기

    너무 너무 감사드립니다.
    vs code 설정하기 너무 까다로워서 포기하려하는 순간에 이 글을 만났습니다.
    건승하세요!

  7. hjh 2022.02.28 16:25 댓글주소 수정/삭제 댓글쓰기

    오...m1 vscode 포기하던 차였는데 ... 이 글을 보게 되었네요 ㅠㅠ.. 감사합니다! 퍼갑니다~~