JUST DO IT PROJECT

[VSCode] Macbook에서 C/C++ 개발환경 구축하기 본문

CSE/C \ C++

[VSCode] Macbook에서 C/C++ 개발환경 구축하기

웨일.K 2020. 3. 10. 19:44

Mac OS에서 C/C++ 개발하기

윈도우 운영체제를 쓰는 분들이라면 C/C++ 개발시 Visual Studio를 많이 사용하실텐데요.
저도 Windows를 주로 쓰다가 최근에 맥북프로를 사용하게 되면서 C/C++ 개발환경을 새롭게 구축했습니다.
macOS용 Visual Studio는 C++를 지원하지 않기 때문에 Xcode나 Visual Studio Code (VSCode)을 사용해서 C/C++ 파일을 컴파일하고 빌드할 수 있습니다.

오늘은 VSCode를 이용해 개발환경을 구축해보겠습니다.

1. VSCode 설치

VSCode는 Microsoft사의 소스코드 에디터로, Windows, Linux, macOS를 지원하는 프로그램입니다.
디버깅, 버전 컨트롤 (Git) 등을 제공하며 GitHub 연동도 가능합니다.
여기에서 macOS용 VSCode를 설치할 수 있습니다.

2. g++, lldb 설치

  • g++ : C/C++ 파일을 빌드하기 위해서 필요합니다.
  • lldb: 디버깅을 위해 필요합니다. Xcode의 디버깅 툴입니다.

둘 다 Xcode를 설치하면 자동으로 설치됩니다. Terminal에서 다음과 같이 확인해볼 수 있습니다.
g++
$ g++ -v
설치되어있다면 버전이 뜨고 그렇지 않으면 에러메시지가 뜹니다. 혹시 설치되어있지 않다면 Command Line Tools를 사용하여 설치할 수 있습니다.


lldb
$ lldb
설치되어있다면 아래와 같이 뜨고 그렇지 않으면 설치가 될 것입니다. (lldb)

3. VSCode 실행 후 확장프로그램 설치

VSCode를 실행하면 다음과 같은 시작화면이 뜹니다.


좌측에 Extenstion 아이콘을 누르고 (단축키: ⌘(Command) + ⇧(Shift) + P) 상단에서 C/C++를 검색합니다.

Microsoft사의 C/C++ extension을 설치합니다.
설치가 끝나면 Install 버튼이 Uninstall로 바뀌게 됩니다.


상단에서 다시 lldb를 검색합니다.
Vadim Chugunov의 CodeLLDB를 설치합니다. CodeLLDB는 VSCode에서 lldb를 사용해 디버깅할 수 있는 확장 툴로, 브레이크포인트, instruction레벨의 stepping 등을 제공합니다.


두가지가 모두 설치되었다면 VSCode를 종료하고 다시 시작합니다.

4. C/C++ 파일 빌드하기

4.1 task.json 파일 수정하기

VSCode에서는 json 파일을 수정해서 빌드 옵션을 변경할 수 있습니다.

먼저 화면 상단메뉴에서 File - Open workspace를 클릭하고 작업공간이 될 폴더를 선택합니다.

이제 이 폴더에 C++ 파일과 빌드파일들이 저장됩니다.
간단한 cpp 파일을 생성하고 기본 코드를 작성해 저장합니다.


좌측 Explorer 패널에서 방금 만든 cpp 파일을 선택하고 ⌘(Command) + ⇧(Shift) + B를 누릅니다.
목록 중에 C/C++: g++ build active file을 찾고 우측에 있는 톱니바퀴모양 아이콘을 선택합니다.


Explorer 패널에서 .vscode가 생기고 그 아래 task.json 파일이 열릴 것입니다.
task.json 파일 중 arg를 아래와 같이 바꿔줍니다.

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558 
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "g++ build active file",
            "command": "/usr/bin/g++",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}.out",

                // 1. execute .out file
                /*
                "&&",   //to join building and running of the file
                "${fileDirname}/${fileBasenameNoExtension}.out",
                */

                //2. file input
                /*               
                "<",
                "${fileDirname}/sample_input.txt"
                */
                //3. file output
                /*
                ">",
                "${fileDirname}/sample_output.txt"
                */

            ],
            "options": {
                "cwd": "/usr/bin"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },       
    ]
}

.out file 실행 코드

    "&&",   //to join building and running of the file
    "${fileDirname}/${fileBasenameNoExtension}.out",

arg 항목에서 첫번째 주석을 해제하시면 빌드 후 생성된 .out 파일을 바로 실행할 수 있습니다.

파일 입력 코드

    "<",
    "${fileDirname}/sample_input.txt"

arg 항목에서 1번 주석을 해제한 상태에서 2번 주석을 해제하시면 stdin 대신 파일 입력을 사용할 수 있고, 그때 사용하는 파일명을 설정할 수 있습니다. 위에서는 sample_input.txt로 정해져있습니다.
이 주석을 해제하고 sample_input.txt 파일을 만들지 않으시면 아래와 같은에러가 발생합니다. 인풋 파일이 없다는 에러이니 .cpp파일과 같은 폴더에 파일을 만들어 주세요.
[에러 그림]

파일 출력 코드

     ">",
     "${fileDirname}/sample_output.txt"

arg 항목에서 1번 주석을 해제한 상태에서 2번 주석을 해제하시면 stdout대신 파일 출력을 사용할 수 있고, 출력파일 명을 설정할 수 있습니다. 위에서는 sample_output.txt로 정해주었습니다. 출력파일은 파일명을 작성해두시면 자동으로 생성됩니다.

원하는 옵션을 선택하신 후에 task.json 파일을 저장(⌘(Command) + S) 해주세요

4.2 C/C++ 파일 빌드하기

다시 cpp 파일을 열어서 ⌘(Command) + ⇧(Shift) + B 를 눌러주시면 g++로 빌드 됩니다.

Errors

  • 아래와 같은 에러는 cpp파일을 선택하지 않은 상태에서 빌드하면 발생합니다. 종종 json 파일을 수정하고 바로 단축키를 누르는 실수를 할 수 있는데 json은 컴파일이 안되어서 아래와 같은 에러가 발생합니다. 따라서 cpp 파일을 선택한 뒤 빌드해주셔야 합니다.

    ld: warning: ignoring file /경로.../.vscode/tasks.json, building for macOS-x86_64 but attempting to link with file built for unknown-unsupported file format ( 0x7B 0x0A 0x20 0x20 0x20 0x20 0x2F 0x2F 0x20 0x53 0x65 0x65 0x20 0x68 0x74 0x74 )
    Undefined symbols for architecture x86_64:
    "_main", referenced from:
       implicit entry/start for main executable
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    The terminal process terminated with exit code: 1
  • cpp 파일에 아무 내용도 작성을 안하시면 아래와 같은 에러가 발생합니다. (정확히는 main 함수가 없으면 발생합니다.) 기본 코드 Hello world라도 작성해야 빌드할 수 있습니다.

    Undefined symbols for architecture x86_64:
    "_main", referenced from:
       implicit entry/start for main executable
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    The terminal process terminated with exit code: 1

5. 빌드파일 실행하기 + 디버깅

성공적으로 빌드했다면 Explorer 패널에 .out 파일이 생성되었음을 확인할 수 있습니다. 이 파일을 실행하는 방법은 두가지가 있습니다.

  • 3번항목의 arg 주석을 해제해서 사용하는 방법입니다. 디버깅 없이 실행
  • CodeLLDB 이용해서 디버깅하며 실행

5.1 실행 옵션 설정

디버깅을 하기 위해서 아까 설치한 lldb를 이용하도록 json 파일을 만들어줄 것입니다.
.vscode 폴더에 launch.json이라는 이름으로 아래와 같이 파일을 생성합니다.

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "request": "launch",
            "name": "Launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}.out",
            "args": [],
            "preLaunchTask": "g++ build active file",
            "stdio": [null,null,null],
            "terminal": "integrated"
        }
    ]
}
  • "preLaunchTask": 디버깅 전에 먼저 수행할 task이름을 적는 곳입니다. 우리는 빌드를 한 후 디버깅을 할 것이기 때문에 앞서 작성한 task.json의 라벨명인 "g++ build active file"을 작성해줍니다. 혹시 task.json에서 label 항목을 다르게 설정했다면 여기에 같은 이름으로 작성해주셔야 합니다.
  • "stdio": 입출력을 설정하는 곳입니다. 위 예제는 모두 null로 표준 입출력입니다. 만약 파일입출력을 하고싶다면 순서대로 stdin, stdout, stderr와 연결할 파일명을 작성하면 됩니다. 여기서도 입력파일명을 작성하였으나 파일이 존재하지 않으면 에러가 뜹니다.

5.2 디버그모드로 실행

좌측 디버깅 아이콘을 누르거나 ⌘(Command) + ⇧(Shift) + D를 누르면 디버깅 패널이 뜹니다. 상단의 실행버튼을 누릅니다.
하단의 콘솔에서 Terminal을 선택하고 Launch task 를 선택하시면 실행 결과를 볼 수 있습니다. 파일 출력을 설정하셨다면 explorer 에서 출력파일이 생성되었음을 확인할 수 있습니다.


코드의 라인넘버 좌측을 클릭하면 브레이크포인트를 설정할 수 있습니다. 브레이크 포인트 설정 후 실행하면 디버깅에 유용한 정보들을 확인할 수 있습니다.

 

6 Comments
  • 프로필사진 학부생 2020.04.18 00:59 궁금한 점이 있어서 댓글 남깁니다.
    이 컴파일러로는 vector를 사용할 수 있습니까??
  • 프로필사진 웨일.K 2020.05.03 00:46 신고 네, vector 사용 가능합니다 :D
  • 프로필사진 맥북C 2020.05.24 22:20 안녕하세요. 좋은 정보 얻어 갑니다.
    저는 XCODE로 작성하고
    bash에서 결과물을 확인하곤 했는데요.

    이런 방법들은 검색으로 아는 건가요, 어떻게 하면 이런 걸 혼자 스스로 알 수 있는 경지가 되는건가요?
  • 프로필사진 웨일.K 2020.05.24 23:59 신고 안녕하세요, 말씀하신대로 저는 구글 검색을 통해서 알게 되었습니다. 이 글을 예로 드리자면, "맥에서 c++ 개발하는 법"과 같이 검색해서 나오는 글들을 토대로, 어떤 프로그램이 있는지, 무엇이 더 나은지, 어떻게 설치해야 하는지 등등을 다시 검색합니다. 여러 방법을 읽어보고 직접 시도해 본뒤에, 가장 적합해보이는 것을 정리해서 블로그에 올리고 있습니다. 시간이 지나면 업데이트 되어서 방법이 달라지는경우가 있어서,, 가능한 최근에 올라온 글을 참고하려고 하는 편입니다.

    혹시 영어 사용에 불편함이 없으시다면 공식 사이트를 비롯한 다양한 소스로부터 정보를 얻으실 수 있습니다. 특히 공식 사이트에서 튜토리얼을 제공해주는 경우가 많아서, 참고하시면 더 정확한 정보를 얻으실 수 있습니다. 요즘에는 유튜브에 영상으로도 많이 올라오더라구요.

    덧붙여 말씀드리면, 저는 페이스북에서 관심사와 관련된 그룹에 가입해서 최신 정보를 접하려고 하는 편입니다. 자주 사용하는 키워드들을 접하면 검색할 때 도움이 되는 것 같습니다. 저도 아직 부족한 점이 많아서 많은 분들의 도움을 얻고 있습니다. :D
  • 프로필사진 123 2020.06.19 11:36 안녕하세요, 위 방법대로 초기 설정을 했는데, taks.json 파일을 설정한 뒤 c언어 파일을 실행시키면
    clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated [-Wdeprecated]
    라고 오류가 나오네요.. c++로 설정된 json 파일로 c언어를 돌려서 생기는 오류인것 같은데 어떻게 해결할 수 있을까요..?
  • 프로필사진 2020.10.10 21:35 비밀댓글입니다
댓글쓰기 폼