티스토리 뷰
C++ 기반으로 onnxruntime 라이브러리를 테스트해볼일이 있었는데 MinGW g++ Compiler로 빌드가 안되는 문제가 발생했다.
https://github.com/microsoft/onnxruntime/issues/1175
꾸역꾸역 MSVC Compiler로 빌드해서 테스트는 잘마쳤다.
하면서 삽질을 좀 많이 하게됐는데 이제서야 .vscode/ 에 생성되는 json 파일들의 역할에 대해 이해가 됐다.
이 글에서는 VSCode IDE + CMake + MSVC Compiler 환경에서의 빌드 방법과 디버그를 위한 설정방법을 정리한다. 기록안해두면 내가 삽질할 거 같아서 내가 보려고 기록한 글이다.
시작전에 c/c++ extension이랑, CMake, CMake Tools는 깔고 시작하자.
근데 이걸 먼저 깔았는지 CMake를 따로 https://cmake.org/download/ 이 링크를 통해 설치했는지 기억이 잘안난다... 하여튼 CMake를 설치하고 환경변수에 cmake.exe 가 위치한 곳의 경로를 입력해두자... 저거 없어도 될 거 같기도한데... 오늘보니 과거의 내가 깔아뒀길래 일단 언급해둠.
0. 먼저 폴더(프로젝트)를 하나 생성하고 작업 시작하자!
1. 소스코드 파일을 하나 만들자
#include <iostream>
int main()
{
std::cout<<"hello world"<<std::endl;
return 0;
}
자 이제 main.cpp 를 빌드해보자.
여기까지 vscode는 그냥 편집기에 불과하다.
2. 빌드를 하기위해 CMakeLists.txt를 생성하고 main.cpp를 빌드하기 위한 명령어를 작성하자
project(helloworld)
add_executable(helloworld main.cpp)
3. 빌드과정으로 인해 생길 부산물들이 프로젝트를 더럽히지 않도록 이를 저장할 폴더를 따로 만들어두자
4. 빌드해보자
cd build
cmake .. -G "Visual Studio 16 2019"
cmake --build ./
-G 는 build를 하기 위해 어떤 Generator를 쓸건지를 지정하는 옵션이다.
저 Generator가 없다면 https://visualstudio.microsoft.com/ko/downloads/ 여기서 vs installer를 받고 Build Tool을 받아주자
이렇게 하면 {프로젝트 폴더}/build/Debug/ 에 helloworld.exe 가 생긴 것을 확인할 수 있을 것이다.
끝!
이 아니다.
이 작업을 빌드해야할때마다 언제 다 하고 앉아 있나!
빌드하기 위한 명령어는 작업 도중에 크게 달라지지 않으니 매크로 마냥 등록해두고 필요할때 휙휙 단축키로 빌드하고 싶다. 그래서 필요한게 tasks.json 이다.
5. tasks.json 를 정의해보자
위에 사진대로 명령을 실행시키면 아래와 같이 tasks.json 파일이 생성될 것이다. 일단 아래 과정을 무작정 따라해보자.
자 이렇게 생성하고나서
를 누르고
를 누르면
echo 란 게 뜨는 걸 확인할 수 있다. 저 echo가 뜨는 이유는 tasks.json에 "echo"라는 라벨을 가진 task가 존재하기 때문이다.
일단 echo를 선택하고 엔터를 눌러보자. tasks.json의 내용이 일부 변경된걸 확인할 수 있다.
그러고 나서 ctrl + shift + b 를 누르면 갑자기 터미널 창이 켜지고 어떤 명령어들이 실행되고 아래와 같은 화면을 볼 수 있을 것이다. 저기서 isDefault란 값이 true란 것은 ctrl+shift+b를 눌렀을때 "label"이 "echo"인 task를 Default로 수행한다는 것을 허용한다는 뜻이다.
명령어창에 Hello가 나온걸 확인할 수 있는데 바로 "echo"란 task를 실행해서 "echo Hello"라는 "command"를 자동으로 실행됐기 때문이다.
이제 우리가 할 일은 main.cpp 를 빌드하는 명령어를 실행하도록 "command"를 수정하는 것이다!
라고 했지만 실제로는 "label"도 수정했고 "options"란 항목도 추가된 걸 볼 수 있다. "label"은 그냥 task 이름을 수정해준것이여서 크게 중요치 않다. "options"를 먼저 봐보면, "cwd"가 있고 그 옆에 "${workspaceFolder}/build" 란 값이 정의되어 있는것을 확인할 수 있다.
"cwd"는 "command"가 실행될 위치를 의미한다. 위에서 프로젝트 폴더(=workspaceFolder)의 build 폴더에서 빌드하기로 했으니 프로젝트 폴더의 build폴더를 지정해준 것이다.
그리고 "command"에서 빌드부터 실행(run)까지 되도록 명령어를 입력시켜주었다. ;로 나누어져있는데 연속해서 다른 명령어를 실행하고 싶을때 ;로 나눠주면 된다.
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "cmake build and run",
"type": "shell",
"command": "cmake .. -G 'Visual Studio 16 2019'; cmake --build ./; cd ./Debug; ./helloworld.exe",
"options": {
"cwd": "${workspaceFolder}/build"
},
"problemMatcher": [],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
이렇게 설정을하고나서 ctrl+shift+b 를 눌러보면 hello world가 출력되는 것을 확인할 수 있다.
6. 디버거를 설정해보자
이제 디버거를 설정해보자!
처음에 GDB로 잘못 설정해서 시간을 한참 날렸다... GDB 는 gcc, g++ 로 컴파일된 경우에 선택하면 된다...
여기서 "program"경로를 설정해주면 된다.
디버거를 실행시키기 전(=Pre에 빌드(=Task)를 매번 실행(=Launch)하고 싶다면, "preLaunchTask" 를 정의해주면 된다. 아까 build task의 이름("label")을 "cmake build and run"이라고 했으니 "preLaunchTask"를 "cmake build and run"이라고 해보겠다. 첫 라인부터 중단점을 잡고 싶다면 "stopAtEntry"를 True로 설정하면 된다. 그리고 vscode 상 터미널상의 콘솔로 결과를 보기위해서는 "console"을 "integratedTerminal"로 정의해주면 된다.
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(Windows) 시작",
"type": "cppvsdbg",
"request": "launch",
"program": "${workspaceFolder}/build/Debug/helloworld.exe",
"args": [],
"stopAtEntry": true,
"cwd": "${fileDirname}",
"environment": [],
"console": "integratedTerminal",
"preLaunchTask": "cmake build and run"
}
]
}
이제 F5를 누르거나 아래 사진에 위치한 메뉴로 가서 노란색펜으로 표시한 버튼을 누르거나
툴바의 Run 버튼을 눌러 Start Debugging을 누르면 디버거가 실행될 것이다.
'C++' 카테고리의 다른 글
C++/FFmpeg av_err2str() C4576 error (0) | 2022.06.04 |
---|---|
Variadic functions / c/c++ 이 가변 인자를 받을 수 있었다고??... (0) | 2022.06.03 |
[C++] Class Static Member Variable(C++ 스태틱 멤버변수) 초기화를 Header File에서 해보자 (0) | 2022.01.24 |
[C++] zero padded number 변환 (0) | 2021.12.30 |
[C++] multiple definition of ~ 전담 수비수 static, namespace (0) | 2021.07.29 |
- Total
- Today
- Yesterday
- 가장 긴 증가하는 부분 수열
- LCA
- 자료구조
- 이분탐색
- 백준
- ㅂ
- 단축키
- MOT
- FairMOT
- 백준 1766
- 백준 11437
- 인공지능을 위한 선형대수
- 백준 11053
- C++ Deploy
- 문제집
- 백트래킹
- 파이참
- 위상 정렬 알고리즘
- PyCharm
- cosine
- Lowest Common Ancestor
- 순열
- 조합
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |