Knowhow/C, C++, CMake

VScode C/C++ 개발 세팅, CMakeLists.txt 이용하기 1

침닦는수건 2023. 1. 9. 22:55
반응형

Python을 주로 사용하면 코드를 실행시키는 것이 아주 간단하지만 C/C++을 사용해보면 그리 단순하진 않다는 걸 알게 된다. 컴파일, 링크, 빌드, make, cmake 등 온갖 키워드가 등장하는데 제대로 이해하고 있지 않다면 코드를 실행하는 것까지가 큰 산으로 느껴진다. 그리고 기초적인 내용이라 누구에게 물어보기도 애매하고 어떻게 실행해요?라고 묻는 격이라 부끄끄러워서 더 어렵게만 느끼지더라.

 

따라서 13~15년도 학교에서 C/C++ 문법만 배운 것이 전부인 내가 주먹구구식으로 개발이 가능할 정도까지 필요했던 간단한 개념을 정리하고 함께 가장 많이 쓰이는 에디터, VScode에서 개발 환경 세팅하는 방법을 소개하고자 글을 적는다.

 

알고 있어야 하는 기본 개념

 

1. 인터프리터 언어와 컴파일 언어

한 번쯤은 들어보았을텐데 프로그래밍 언어는 크게 두가지 타입이 존재하고 하나는 컴파일 언어, 나머지 하나는 인터프리터 언어이다. 대표적으로 C/C++은 컴파일 언어이고, python은 인터프리터 언어다. 이 두가지 언어는 문법적인 차이 뿐만 아니라 원리 자체가 다르기 때문에 대략적이라도 차이를 알고 있는 것이 좋다. 

 

프로그래밍 언어는 사람이 적는 명령어의 집합과 같은데 이것은 영어로 되어있다. 이를 컴퓨터가 수행하도록 만들기 위해선 기계어로 통역해주는 작업이 필요하다. 두 언어의 차이는 여기에 있다. 

 

컴파일 언어는 코드를 기계어로 사전에 변환 완료해두고 실행 시 이를 읽어 사용하는 언어다. 비유하자면 영어 연극 대본이 있을 때, 미리 영어 대본을 한국어 대본으로 번역 완료해두고 공연이 시작되면 배우는 한국어 대본으로 연기를 하는 형태다.  반면, 인터프리터 언어는 코드를 실행했을 때 바로 바로 변환해서 실행하는 언어다. 또 다시 비유하자면, 영어 대본 그대로 사용하는데 실시간으로 배우의 인이어를 통해 한국어 대사를 말해주는 식으로 공연하는 형태다. 

 

따라서 컴파일 언어는 사전에 코드에서 기계어로의 변환 작업을 완료해두기 때문에 빌드 시간이 길지만 런타임 속도는 인터프리터 언어보다 월등히 빠르다. 동시통역 인이어보다 모국어 대본을 들고 있는 배우가 막힘없이 대사를 칠 수 있는 것과 비슷하다. 그리고 오류가 있다면 사전 변환 작업에서 실행 전에 발견할 수 있다. 왜 C/C++이 일단 실행하는게 어려운 대목이다. 오류를 사전에 감지하기 때문에 실행까지가 더 까다롭다. 문법 오류, 링크 오류 등등 모든 오류를 사전검열하여 무결한 상태로 만들어야 실행할 수 있다.

 

인터프리터 언어는 실시간 변환이기 때문에 바로 실행할 수 있다. 개발 속도를 높일 수 있는 장점이 있기도 하지만 오류 검증이 사전에 되어있지 않기 때문에 중간에 런타임 오류로 프로그램이 멈추는 일이 잦고 속도가 느린 편이다. 가장 까다로운 파일 간 연결 관계 파악도 실행 중에 찾아가기 때문에 느리지만 일단 실행은 쉽다. 

 

여기서 요점은 C/C++은 컴파일 언어이기 때문에 사전 변환 작업(컴파일, 링크, 빌드)을 알고 할 줄 알아야한다는 것이다. 

 

2. 컴파일과 링크, 그리고 빌드

 

우리가 작성한 코드를 실행 파일로 만드는 것을 빌드(build)라고 한다. 그리고 그 빌드는 컴파일(compile)과 링크(link)로 구성된다. 컴파일은 소스코드를 오브젝트 파일(중간 산물 정도로 이해하면 된다.)로 만드는 과정이고 링크는 이 오브젝트 파일을 서로 연결하여 실행파일 형태로 만드는 과정이다. 컴파일이 각 스크립트를 .o 파일로 만든다면 링크가 .o 파일을 묶어서 실행파일 .exe 파일화함과 동시에 오브젝트 파일 간에 참조 관계, 연결 관계를 파악해두는 작업을 한다. 

 

GCC (GNU compiler collection) 내에 gcc와 g++이 대표적인 컴파일러이며 링크 기능까지 포함하고 있다. 빌더(builder)라고도 한다. gcc는 .c 파일과 .cpp 파일을 각각 c언어와 c++언어로 컴파일하며 g++은 .c 파일과 .cpp 파일 모두 c++언어로 컴파일한다. 일반적으로 gcc는 c, g++은 c++로 알고 있지만 정확히는 아니니 기억해두까진 하자. 

 

gcc -c [c file name]
g++ -c [c++ file name]

gcc -o [o file name]
g++ -o [o file name]

 

3. make와 cmake, CMakeLists.txt

make는 위 빌드 작업이 귀찮아서 탄생했다. 쉘스크립트를 써서 한 번의 명령어로 끝나게 만든다 한들 gcc 및 g++ 명령어를 파일 개수만큼 적어야 하고 일부만 바뀌었을 때도 전체를 다시 해야하는 문제 때문에 생겨났다. 사전에 MakeFile을 문법에 맞게 작성해두고 이를 사용해 반복 빌드를 할 경우, 효율성을 높일 수 있다. 여기까지만 알면 된다. 더 알 필요가 없다.

 

cmake는 make가 귀찮아서 탄생했다. make 파일로 효율성이 많이 높아졌지만 그래도 여전히 파일 간의 참조 관계나 연결 관계를 직접 적어야하는데 이는 프로젝트가 규모가 커지면 쉬운 일이 아니다. 그래서 cmake는 참조 관계, 연결 관계를 파악하여 자동으로 MakeFile을 만들어주는 역할을 수행한다. 즉, cmake 쓴 뒤 나온 MakeFile로 make 하면 프로젝트 전체를 빌드하는 것이 된다.

 

cmake는 make 대비 문법도 쉽다. 직관적인 수준이다. CMakeLists.txt 파일을 작성해두고 해당 txt 파일 위치에서 cmake .를 사용하면 끝이다. CMakeLists.txt 작성법은 따로 검색해보는 것을 추천한다. 

 

- 2편에 계속 -

반응형

'Knowhow > C, C++, CMake' 카테고리의 다른 글

TBB 팁  (0) 2023.09.25
Boost serialization 팁들  (0) 2023.09.25
Boost serialization  (0) 2023.09.25
CMake 백과사전  (0) 2023.09.21
VScode C/C++ 개발 세팅, CMakeLists.txt 이용하기 2  (0) 2023.01.09