티스토리 뷰

C++

Cpp + VSCode + CMake + MSVC Compiler on Windows

developer0hye 2022. 3. 15. 00:07

C++ 기반으로 onnxruntime 라이브러리를 테스트해볼일이 있었는데 MinGW g++ Compiler로 빌드가 안되는 문제가 발생했다.

 

https://github.com/microsoft/onnxruntime/issues/1175

 

error: unknown type name '_Frees_ptr_opt_' · Issue #1175 · microsoft/onnxruntime

Describe the bug I am trying to include onnxruntime into a c-application for win 10. For that I use the precompiled binaries here. Compiling of my program stops with error: unknown type name '_...

github.com

 

꾸역꾸역 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을 누르면 디버거가 실행될 것이다.

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함