[m1 / VS Code] m1에서 C/C++ 개발환경 구축하기

 

 프로그램 개발 단계

프로그램이란 컴퓨터로 하여금 특정 작업을 수행하도록 하는 명령어들의 집합이다.

프로그램을 작성하는데엔 아래와 같은 단계를 거쳐야한다.

 

 

프로그램 목적 정의

요구 분석과 시스템 분석을 통하여 프로그램이 가져야 할 기능 정의

 

프로그램 설계

분석된 기능을 처리할 수 있도록 구조 설계

 

소스 코드 작성

설계를 기반으로 에디터를 사용하여 작성

 

컴파일 / 링킹

소스 코드를 실행 가능한 코드로 변환 및 문법 검사

 

프로그램 실행

 

테스트와 디버깅

에러 검사 및 디버깅

 

유지 보수

 

 

  • 에디터 : 소스 코드(source code)를 쉽게 작성해 기억장치에 저장할 수 있도록 도와주는 도구.
  • 컴파일러 : 에디터를 사용하여 작성한 소스 코드를 컴퓨터가 이해할 수 있는 기계어로 바꾸어주는 번역 소프트웨어.

 C프로그램 완성 과정

C 언어로 작성된 프로그램은 크게 코딩, 컴파일, 링킹이라는 3단계 과정을 거쳐 완성된다.

  1. 소스 파일 생성
    소스 코드(source code) : C프로그램 안에 있는 명령어들. 에디터를 이용해 입력한다.
    .c 확장자를 가진 소스 파일로 저장된다.

  2. 소스 파일 컴파일
    컴파일 :  작성된 소스 파일을 컴퓨터가 이해할 수 있도록 기계어로 변환하는 과정
    컴파일러를 이용해 컴파일 하면 .obj 확장자를 가진 목적 파일(object file)이 만들어진다.

  3. 실행 파일 생성(링킹)
    링커(linker) : 컴파일 된 목적파일들을 라이브러리 파일과 연결하여 실행파일을 만드는 링킹 과정에서 필요한 도구 
    컴파일러는 대부분 링커 기능까지 제공하므로 컴파일 시 자동적으로 처리된다.
    링킹 과정이 끝나면 .exe라는 확장자를 가진 실행파일이 만들어진다. 

C언어의 경우 에디터는 상관없이 사용가능하지만 C컴파일러가 필요하다. Dev-C++과 Visual Studio가 여기에 속한다.

그러나 mac용 Visual Studio의 경우 C언어가 지원되지 않는다. 이걸 모르고 삽질을 꽤 오래 했다.

나는 xcode가 열리지않았고(대체 왜), 익숙한 환경에서 가볍게 개발하길 원했기 때문에 VS Code를 사용하기로 했다.

 

 

 Visual Studio Code 에서 C/C++ 개발 환경 구축하기

1. Extension - C/C++ 설치

 

2. C/C++ 파일 생성하기

컴파일을 진행하기 위해 원하는 폴더에 C/C++파일을 생성 해준다. 

아래 코드는 C를 기준으로 작성되어 확장자가 .c이다. C++은 .cpp로 설정하면 된다.

#include <stdio.h>
 
int main()
{
    printf("문자열을 입력후 엔터를 누르세요!\n");

    char a[256];
    scanf("%s", a);

    printf(" \" %s \" 를 입력하셨네요.\n", a);
    return 0;
}

 

VS Code는 에디터이기때문에 바로 프로그램을 돌릴 수 없다. 코드를 빌드할 컴파일러와 옵션을 지정해줘야한다.

여러가지 컴파일 해봤는데 gcc, g++ 이 안먹혀서 clang👍  으로 해결했다.

 

3. 빌드 단축키 설정

tasks.json 파일 생성에 앞서 설정 > 바로가기 키에서 다음과 같이 테스트 작업 실행 단축키를 만들어준다.



명령어를 입력하면 당연히 템플릿이 없기 때문에 위와 같이 나온다. '실행할 테스트 작업이 없습니다.' 를 클릭한다.

 

'템플릿에서 tasks.json' 파일 만들기를 클릭한다.

 

'Others'를 클릭한다. 

 

여기까지 따라오면 tasks.json파일이 새로 생성된다. 왼쪽 패널에서도 확인할 수 있다.

tasks.json 파일 내 기존 코드를 지우고 아래와 같이 구성해준다.

{
  "version": "2.0.0",
  "tasks": [
      {
          "type": "shell",
          "label": "C bulid for clang",
          "command": "clang",
          "args": [
              "-g",
              "${file}",
              "-o",
              "${fileDirname}/${fileBasenameNoExtension}"
          ],
          "options": {
              "cwd": "${workspaceRoot}"
          },
          "presentation": {
              "clear": true
          },
          "group": {
              "kind": "build",
              "isDefault": true
          },
          "problemMatcher": []
      },
      {
          "type": "shell",
          "label": "C++ bulid for clang++",
          "command": "clang++",
          "args": [
              "-g",
              "${file}",
              "-o",
              "${fileDirname}/${fileBasenameNoExtension}"
          ],
          "options": {
              "cwd": "${workspaceRoot}"
          },
          "presentation": {
              "clear": true
          },
          "group": {
              "kind": "build",
              "isDefault": true
          },
          "problemMatcher": []
      },
      {
          "type": "shell",
          "label": "execute",
          "command": "${fileDirname}/${fileBasenameNoExtension}",
          "group": "test",
          "presentation": {
              "clear": true
          }
      }
  ]
}

 

tasks.json 파일을 저장한 뒤 기존 C/C++ 파일로 돌아가 빌드 실행 명령어 Command + Shift + b 를 입력한다.

(나는 빌드 명령어도 단축키로 설정해놨다.)

 

두 개의 build task가 생성된 것을 볼 수 있다.

C/C++ 파일에 맞는 것으로 선택해준다.

 

build 작업이 끝나면 다음과 같이 파일들이 생성된 것을 볼 수 있다.

.vscode - tasks 파일은 각 프로그램 파일마다 하나씩 있어야한다.
폴더 지정을 잘못할 경우 빌드는 되지만 종료 코드 -1 을 뱉어내니 유의 해야한다! 이걸로 파일이 안만들어져 엄청 싸웠다.

 

4. 프로그램 실행

테스트 작업 실행 단축키를 다시 입력하면 하단 터미널에 프로그램이 실행된다!!

빌드 단축키가 아니다 헷갈리면 안된다.

 

 

👇   각 코드가 어떤 기능을 하는지 살펴보기

더보기

tasks :  뒤에 오는내용이 수행할 작업에 대한 내용

 

label : 중괄호로 묶여있는 부분의 이름. 이후 Command + Shift + b 를 눌렀을 때 표시되는 내용

 

type : 작업이 수행되는 공간

 

command : 작업공간에서 수행할 명령

 

args : 위 command에 적어준 명령의 파라미터를 넣어줌

 

-g : 디버깅을 위한 옵션

 

-o : 출력파일의 이름을 정의

 

${fileDirname}/${fileBasenameNoExtension}.out : 파일의 현재 디렉토리에 파일명.out 파일을 생성

 

${file} : 현재 파일을 의미. 해당 파일이 여기서는 gcc의 입력이 됨

 

 

 

 

* 해당 프로그램을 디버깅하는 과정은 추가 예정 (m1 은 디버그 지원이 안된다고 함..)

* m1 mac air에서 실행됐다.