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 에서 출력파일이 생성되었음을 확인할 수 있습니다.


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

 

반응형