Ubuntu 18.04 LTS에 Visual studio code 설치 및 C, Python 개발 환경

이번 글에서는 Ubuntu 18.04 LTS에 Visual studio code를 설치하고 지난번 글 "Visual Studio Code 설치 및 C 복습" 처럼 C 기반 개발 환경은 물론 나아가 Python 기반 개발 환경까지 꾸며보는 과정을 적어보려고 한다.
당시에 약간 쓸 데 없는 introduction이 길어져서 막상 C 개발 환경 구축하는 과정은 자세히 적지 않았는데 이번에는 하나 하나 기술하도록 하겠음.

1. Ubuntu 18.04 LTS에 Visual studio code 설치
2. C 개발 환경 만들기
3. Python 개발 환경 만들기 (Anaconda 포함)


1) Ubuntu 18.04 LTS에 Visual studio code 설치

Visual studio code 공식 홈페이지에 가면 다음과 같이 나와있다.


그러므로 그대로 따라한다.. ㅋ
일단 사용하는 Ubuntu 18.04 LTS 운영체제에 맞는 32-bit 또는 64-bit 버젼의 .deb 설치 파일을 홈페이지에서 다운을 받는다.


그 후 terminal에서 다음의 명령어를 통해 install.

>> sudo apt-get install /path/to/vscode install file



이것도 바로 side bar에 추가해 주자.

2) C 개발 환경 만들기

이번에도 webnautes님의 블로그 "Visual Studio Code에서 C/C++ 프로그래밍( Windows / Ubuntu)" 글을 참고하여 수월하게 진행했다.


C/C++ compiler 설치

Windows의 경우 gcc 및 g++ compiler를 사용하기 위해서는 minGW를 설치하고 path를 설정해줘야하는 수고를 해줘야한다.
반면 Ubuntu는 terminal 창에 다음과 같은 명령어 한 줄이면 끝.

>> sudo apt-get install  build-essential


Extension 설치

Visual studio code를 실행한 후 다음과 같이 C/C++ extension을 설치한다.
intelliSense? 등 keyword에 대한 각종 편의 기능을 이용할 때 유용한듯?



gcc/g++ Compiler 설정

그럼 이제 연습용 폴더를 하나 만든 후에 main.c를 적당히 작성해 보자.



Compiler를 어떤 것으로 선택하고, 또 compile 하는 방법에 대해 설정해주기 위하여 Terminal -> Configure Default Build Task -> C/C++: gcc blah blah.. 클릭.



그러면 task.json 파일이 열릴텐데 싹 다 지우고 다음의 코드를 붙여넣기!



{
    "version": "2.0.0",
    "runner": "terminal",
    "type": "shell",
    "echoCommand": true,
    "presentation" : { "reveal": "always" },
    "tasks": [
          // C++ compile
          {
            "label": "save and compile for C++",
            "command": "g++",
            "args": [
                "${file}",
                "-g",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "group": "build",

            // Show errors on editors while compiling
            // See https://code.visualstudio.com/docs/editor/tasks#_defining-a-problem-matcher

            "problemMatcher": {
                "fileLocation": [
                    "relative",
                    "${workspaceRoot}"
                ],
                "pattern": {
                    // The regular expression.
                   // Example to match: helloWorld.c:5:3: warning: implicit declaration of function 'prinft'
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        },
        // C compile
        {
            "label": "save and compile for C",
            "command": "gcc",
            "args": [
                "${file}",
                "-g",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "group": "build",

            // Show errors on editors while compiling
            // See https://code.visualstudio.com/docs/editor/tasks#_defining-a-problem-matcher

            "problemMatcher": {
                "fileLocation": [
                    "relative",
                    "${workspaceRoot}"
                ],
                "pattern": {
                    // The regular expression.
                   // Example to match: helloWorld.c:5:3: warning: implicit declaration of function 'prinft'
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        },
        // Excute the binary (Ubuntu)
        /*
        {
            "label": "execute",
            "command": "cd ${fileDirname} && ./${fileBasenameNoExtension}",
            "group": "test"
        }
        */
        // Excute binary (Windows)
        {
            "label": "execute",
            "command": "cmd",
            "group": "test",
            "args": [
                "/C",
                "${fileDirname}\\${fileBasenameNoExtension}"
            ]
        }
    ]
}

** 맨 마지막 부분에 Windows의 경우와 Ubuntu의 경우가 따로 따로 되어있으니 알맞게 선택해서 사용하면 될 것.
아직도 이 코드를 100% 정확하게 이해하지 못했지만 잘 돌아간다. ㅎㅎ..
최근에 주어들은 이야기로는 "-g"의 경우 debugging 용도인 것 같고, "-o"의 경우 최적화된 compile 방법인 것 같음.
참고로 "-o"로 compile 할 경우 최적화랍시고 compile을 상식적인 순서로 하지 않는 모양.
그래서 나중에 리버싱 등으로 프로그램 분석할 때 main 찾는데 헤맬 수도 있음 ㅜ (경험담)
정정.
gcc에서 compile 옵션은 다음과 같다고 한다. (출처: 참 놀라운 세상)

1) gcc 파일명(*.c) : Default로 out 파일이 생성된다. (e.g. a.out)
2) gcc -c 파일명(*.c) : 오브젝트 파일을 생성한다.
3) gcc -c 오브젝트_파일명(*.o) 파일명(*.c)
   gcc -o 실행파일명(*.out) 오브젝트_파일명(*.o)
4) gcc -o 실행파일 파일명(*.c) : 실행 파일을 만든다. (3번을 한줄로...)
고로 저 위 박스 안에 있는 기능은 그냥 단 한번에 실행 파일 (.exe)가 생성되는 것인듯, 간편하게.


Build를 위한 shortcut key 설정

File -> Preferences -> Keyboard Shortcuts 고고


아래 그림에서 빨간색으로 동그라미 친 버튼 누르기


keybindings.json 이라는 파일이 열릴텐데 그곳에 다음과 같이 작성하고 저장



// Place your key bindings in this file to override the defaults
[
    // Compile
    { "key": "ctrl+alt+c", "command": "workbench.action.tasks.build" },

    // Excute
    { "key": "ctrl+alt+r", "command": "workbench.action.tasks.test" }
]


지금까지 설정한 것을 실험해보기 위해서 ctrl + alt + c 로 compile 하고 ctrl + alt + r 을 통해 execution을 해보면...

아래 embedded terminal이 뜨면서 잘 되는 것을 볼 수 있...지 않다(?)
"sh: 1: PAUSE: not found"
라는 오류가 나는데 살짝 알아보니 Windows에서 습관처럼 쓰던 "system("PAUSE")"가 Ubuntu에서는 먹히지 않는 모양이다.
그러므로 그 부분만 지워주면 정상적으로 프로그램이 종료된다.


Debugging 환경 설정

마지막으로 debugging 환경 설정하는 것인데
별로 할 게 없다.
왼쪽에 벌레 모양 버튼 누른 후 F5 누르면 debugging 사용할 수 있음.
세부적인 debugging 환경은 launch.json 파일을 통해 확인할 수 있는데 아래 그림과 같이 찾아 들어가면 launch.json 파일이 생성된다.



Break point 잡고 F5 키 누르면 다음과 같은 에러 메시지가 뜨는데 'Debug Anyway' 누르면 일단 동작은 한다.


왜 이런 오류가 뜨나 봤더니 task.json 에 C compile을 위해 설정한 build 이름과 launch.json에서 이용할 build 이름이 서로 달라서 그랬던 것 같다.
정리하자면, task.json 안에 C compile 부분의 "label" = launch.json 안에 "preLaunchTask"
다음과 같이 launch.json을 조금 수정해주니 오류 없이 debugging 잘 되는 것 확인 함.



3) Python 개발 환경 만들기 (Anaconda 포함)

Windows에서는 보통 Anaconda를 이용해 Python도 설치하고 virtual environment를 만들었다.
활용 예는 Tensorflow CPU 버젼과 GPU 버젼에 대한 환경을 따로 따로 만드는 것이 되겠다.
Ubuntu 18.04 LTS는 자체적으로 Python이 깔려있기 때문에 사실 Anaconda는 물론 Python 조차 다시 설치할 필요가 없다.
하지만 나중에 Machine learning 사용에 대비하기 위해 Anaconda를 억지로라도 한번 깔아보기로 했다.

Anaconda 설치

anaconda.com/distribution에서 Download를 누르고 Python 3.7 (Linux)을 받도록하자


Download가 됐으면 checksum을 해준다.
(그런데 굳이 왜 해줘야 하는지 잘 모르겠다 ㅜ 요즘 다운 받은 파일이 정상적이지 않은 경우가 거의 없지 않나... Ubuntu는 뭔가 다른가...)

>> sha256sum downloaded file, e.g., Anaconda3-2019.07-Linux-x86_64.sh

Output에 같은 파일 이름이 나오면 이상 없다는 뜻이라 함.

그 다음은 설치 명령어

>> bash Anaconda3-2019.07-Linux-x86_64.sh

Enter 몇 번 쳐주고 'yes' 적당히 눌러주면 설치 끝.
(중간에 “Do you wish the installer to initialize Anaconda3 by running conda init?” 라고 물어보기도 하는데 Anaconda 공식 사이트에서 “yes”를 추천한다.)


가상 환경 만들기

이 부분은 이제 익숙함.
이전 글을 응용하여 간단하게 'tf_cpu' 가상환경을 만들어보자.

>> conda create -n tf_cpu python=3.7 anaconda

>> conda activate tf_cpu

>> pip install tensorflow

>> conda list


Visual studio code에 Python extension 설치

C 때와 마찬가지로 python extension 부터 설치한다.



그리고 연습용 폴더를 하나 만들고 간단한 python 파일을 작성해 본다.


이제 Python interpreter를 방금 만든 tf_cpu 환경의 python으로 세팅해줘야한다.
'ctrl + shift + p' 를 누르고 적당히 'select interpreter' 를 치면 관련된 옵션이 뜨며 클릭 후 tf_cpu python을 선택하면 됨.



그러면 setting.json이라는 파일이 생성된다.
즉, 굳이 위 과정을 거치지 않아도 setting.json 파일의 "python.pythonPath"만 적절히 수정해주면 우리가 원하는 경로의 python을 interpreter로 설정할 수 있다.


이제 마지막으로 코드를 실행 시켜볼텐데, 코드 바탕에서 오른쪽 클릭 후 "Run Python File in Terminal"을 클릭하면 밑에 embedded console에 결과가 출력된다.


끝!


Comments

Post a Comment