Visual Studio Code with WSL로 atcoder-cli를 사용하면서 디버깅도 할 수 있는 환경 구축

마치 3일 정도 걸렸다. 우선 형태가 되었으므로 비망록 겸 누군가의 참고가 되면 하는 것으로. (우리 linux나 json 파일이나 원래 IDE에 대한 지식이 전혀 없기 때문에 아마 제대로 한 사람이 보면 「뭐야 이 코드는… 입니다)

소개



파일 구조로서는, C드라이브 바로 아래에 code라고 하는 폴더를 두고, 그 속에 AtCoder라고 하는 폴더를 두고, 한층 더 그 안에 대략적인 분류를 했습니다. 예를 들어 abc086의 a 문제의 폴더를 path를 Linux 스타일로 쓰면,

/mnt/c/code/atcoder/abc051-100/abc086/a

같아요. 내가 만든 거친 분류는 다음과 같습니다.


다만, abc086나 그 이하의 계층은 atcoder-cli(후술)가 자동으로 만들어 주기 때문에 스스로 만들지 않아도 괜찮습니다.

VSCode 및 WSL 배포



이 페이지대로 설정합니다. 리눅스는 맛있는 상태이므로 WSL-Remote는 사용하지 않는 설정으로 만들었습니다.

atcoder-cli 도입



이 페이지와 같이 설정합니다. 템플릿의 설정은 해 두면 즐거운 것 같아서 해 두었습니다.

디버깅 가능한 환경 구축



먼저 boost를 wsl 환경에서 install합니다.
$ brew install boost

굉장히 시간이 걸리고 실패도 하는 것 같아서 잘 가지 않을 때는 몇번이나 하면서 기장에 기다립니다.

그런 다음 이 페이지와 같이 설정합니다. , , 하지만, 여기에서 왠지 전혀 잘 가지 않았습니다 (WSL-Remote를 사용하는 전제이기 때문에 잘 가지 않았던 것일까?). 여러가지 시행착오해서 아래와 같이 json 파일을 재작성하면 나름대로 잘 움직였습니다.

c_cpp_properties.json → 그대로

tasks.json
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            //"options": {
            //    "shell": {
            //        "executable": "/mnt/c/windows/system32/wsl.exe",
            //    }
            //},
            "command": "g++",
            "args": [
                "-std=gnu++1y",
                "-g",
                "-O0",
                "-I/opt/boost/gcc/include",
                "-L/opt/boost/gcc/lib",
                "-o",
                "${fileDirname}/a.out",
                "${file}",
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Bash on Windows Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/a.out",
            "pipeTransport": {
                "debuggerPath": "/usr/bin/gdb",
                "pipeProgram": "/mnt/c/windows/system32/bash.exe",
                "pipeArgs": ["-c"],
                "pipeCwd": "/"
            },
            "cwd": "${fileDirname}",
            "args": [
                "<",
                "${fileDirname}/test/sample-1.in",
            ],

            "stopAtEntry": false,
            "environment": [],
            "externalConsole": true,

            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],

            "sourceFileMap": {
                "${workspaceFolder}": "${workspaceFolder}"
            },
        }
    ]
}

tasks.json에 대해서는, 우선 "executable"을 linux풍의 path로 변경해, 인수 "args"중, 출력처를 그 파일의 디렉토리로 변경했습니다. 이제 atcoder-cli와 함께 사용할 수 있습니다.

launch.json에 대해서는 거의 리눅스 스타일의 path로 변경했습니다. 또한 tasks.json에 따라 출력 파일의 경로도 변경했으며 입력 파일은 online-judge-tools가 떨어진 sample-1.in을 사용합니다. sample-1.in을 만지면 입력을 스스로 설정할 수 있습니다 (물론 그 파일로 oj t하면 WA가 됩니다만).

주의점



매번 우분투에서 시작할 때
$ cd /mnt/c/code/atcoder
$ code .

라고!

그렇지 않으면 VSCode가 tasks.json과 launch.json을 인식하지 못하는 것 같습니다. (어쩌면 설정으로 어떻게 될지도…? 자세한 분 가르쳐 주세요.)

매번 우분투에서 열리는 것이 번거로울 때는 이런 식으로 VSCode에 프로젝트를 고정시켜 두면 좋다고 생각합니다.


그런 다음 파일이 많아지고 main.cpp를 탐색기에서 여는 것이 귀찮은 경우,
/mnt/c/code/atcoder/abc051-100/abc051/a$ code main.cpp

같은 느낌으로 VSCode terminal에서 열면 편할 수 있습니다.

아무래도 좋은 것 (자신용)



네트워크 폴더는 google drive에 자동으로 백업할 수 없으므로 C 드라이브 바로 아래에 code를 두고 WSL에서 조작하는 형태로 했습니다. git 라든지 사용하면 잘 할 수 있습니까?

좋은 웹페이지 즐겨찾기