[알고리즘/환경설정/추천] WSL2(리눅스 커널)을 이용해서 C++코딩하기

SHark·2023년 7월 19일
0

알고리즘

목록 보기
19/20

예전 글을 보면, MinGW를 이용해서 윈도우에 C컴파일러를 직접깔아서 vscode와 연결시켜주는 방식으로 이때까지 코딩을 해왔고, 별 문제가 없었다.

하지만 실제로 기업에서 내준 코딩테스트나 교육기관에 가기위해서 시험을 쳤을 때, 처음 본 런타임 에러가 많았어서 환경을 바꿔보려고한다. 알고리즘글에 있는대로 이용한다면, 만약 런타임에러가 발생하면 그냥 터미널이 꺼지는 형식 으로 에러가 발생할 거다!

물론, vscode에서 해당 설정을 바꾸거나 애초에 visual Studio라는 아주 강력한 C생태계의 IDE를 쓴다면 해결될 문제이다. 하지만, visual studio는 꽤 무거운 프로그램이기도 하고 유료기 때문에 Linux에 기본적으로 장착되어있는 gcc를 직접이용하는 형태로 해보려고 한다.

기존 설정보다는 런타임 에러로그는 확실하게 줄 수 있을테니까!

WSL2

Window SubSystem Linux로 윈도우 환경에 Linux Kernel을 중간미들웨어처럼 삽입해서 쓸 수 있게 해준다. Window PC에서도 단순히 Ternimal창 하나로 Linux를 이용하게 해주는 엄청난 친구이다. 리눅스 버전은 Ubuntu 22.04를 이용할 예정이다.

설치과정은 공식홈페이지를 통해 설치해보자. 이리저리 설명하는 것보다 "Offcial"한 설명을 보는게 더 좋을 것 같다.

https://learn.microsoft.com/ko-kr/windows/wsl/install

Terminal

자신이 따로 사용하는 Shell이 있거나, PowerShell에 익숙한 사람이라면 Powershell을 사용해도된다. 하지만, MS Store에 Terminal을 다운로드 받으면 다양한 Shell을 편하게 사용할 수 있으므로 Sharkk는 MS Store의 Terminal을 추천합니다.

MS Store에서 자신이 사용할 Linux를 설치하면 됩니다. 저는 Ubuntu를 사용할거기 때문에 22.04를 다운받겠습니다.

  • 오류사항
  1. Error code 0x80073D05

Ubuntu를 다운로드 받다가 이전에 ubuntu를 다운받았거나 PC내에 잔여파일이 있을 경우 위와 같은 Errorcode가 발생합니다. 해결하기위서는 Window의 User->AppData->Local ->Packages
폴더 내부에 있는 파일을 삭제해주어야합니다.
뭔가 딱보면 느낌이 오시겠지만, 이 폴더는 Local에 있는 파일들이 있는 장소입니다. 여기서 Ubuntu를 찾으면 되는데, Ubuntu는 CanonicalGroupLimited.Ubuntu.~~~으로 되어있을겁니다.(다른 폴더들을보면 보통 회사들은 자기회사.제품명.~~ )이런식으로 가는거 같습니다.

VSCode를 WSL에서 열기

VSCode의 Terminal을 WSL로 열어도 괜찮지만, 애초에 Linux에서 개발하는것처럼 하기위해서 WSL안에서 vscode를 열어주면 더 좋습니다.

vscode Extension에서 WSL를 다운로드 받아줍니다.

WSL Extension을 받았으면 Terminal에서 Ubuntu에 접속해줍니다.

제일먼저, 우분투 패키지를 업데이트 해준뒤 , GNU 컴파일러와 GDB 디버거를 설치해줍니다.

sudo apt-get update
sudo apt-get install build-essential gdb

설치확인을 위해서 아래의 명령어를 입력해줍니다.

whereis g++
whereis gdb

이제, 자신이 문제를 풀 폴더를 만들어주고, 해당 폴더에서 code . 명령어를 실행해주면 됩니다. 그럼 Remote(원격) 버전으로 vscode가 열리면서 Linux에서 코딩을 하는 환경이 갖춰집니다.

VSCode가 C++알아먹게 해주기

이부분은 Linux나 Window나 똑같이 App이 GNU를 인식하게 하는과정이기 때문에, 동일하게 진행하면 됩니다.

커맨드 팔레트를 열어주고, C/C++ 입력 혹은 Terminal ->Configure Default BuildTask를 누르면 task.json을 생성하겠다는게 나옵니다. C/C++ Extension을 WSL에 까셧다면 아래처럼 생길 거고, 혹시 생성이 되지않는다면 빈파일을 만들고 아래의 내용을 복붙해주시면 됩니다.

{
  "version": "2.0.0",
  "tasks": [
    {
      "type": "shell",
      "label": "g++ build active file",
      "command": "/usr/bin/g++",
      "args": ["-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}"],
      "options": {
        "cwd": "/usr/bin"
      },
      "problemMatcher": ["$gcc"],
      "group": {
        "kind": "build",
        "isDefault": true
      }
    }
  ]
}

build 단축키는 ctrl+shift+b 실행은 Terminal에서 Linux에서 실행하듯이 ./파일명 하면됩니다.

빌드 - 실행 한꺼번에 하기

task.json을 작성하는 방법이 따로 있지만, 거기까지 알면 너무 복잡하기 때문에, 간단하게 소개 하겠습니다. Linux에서 C++로된 프로그램을 실행할 때 명령어는 컴파일 -> 실행을 하게되므로 아래의 두 과정을 따르게 됩니다.

컴파일

  • g++ -o filename(생성될 파일이름) sourcefile.cpp

실행

  • ./filename

혹은, 실행파일(.exe)로 만들고 싶다면 아래의 과정을 거칩니다.
g++ -g ${file} -o ${fileDirname}/${fileBasenameNoExtension}.exe

저는 실행파일보단 컴파일된 binary파일을 원하므로 빌드는 binaryfile을 생성하게 했고, 실행은 해당 파일을 실행하는 것으로 했습니다.
(컴파일과 런타임을 분리해서, 런타임 에러를 좀 보려고함)
-g : 디버그 옵션

{
  "version": "2.0.0",
  "tasks": [
    {
      "type": "shell",
      "label": "g++ build active file",
      "command": "/usr/bin/g++",
      "args": ["-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}"],
      "options": {
        "cwd": "/usr/bin"
      },
      "problemMatcher": ["$gcc"],
      "group": {
        "kind": "build",
        "isDefault": true
      }
    },
    {
      "type": "shell",
      "label": "Run",
      "command": "${fileDirname}/${fileBasenameNoExtension}",
      "problemMatcher": [
          "$gcc"
      ],
      "group": {
          "kind": "test",
          "isDefault": true
      }
    }
  ]
}

2개의 댓글

comment-user-thumbnail
2023년 7월 19일

이 글은 제게 많은 도움이 되었습니다.

1개의 답글