본문 바로가기

Software/C++

[기초] CMake를 이용한 라이브러리 구조화 (goormIDE)

필자의 코딩 첫 경험은 사실 아두이노였다. digitalWrite(1,1);  ^^ 

이후 파이썬, OpenCV, 라즈베리파이, AVRstudio, ROS 등을 거쳐오면서 조금씩 코딩을 알아가고 있다. 

하지만 컴공과가 아니기 때문에 대부분 필요에 의해서 코드를 작성하였다.

그러다 보니 혼자만 읽을 수 있고 작동되는 코드를 작성했다.

그냥 모든 코드를 하나의 소스파일에 때려적고 실행시켜도 동작만 잘되면 완성이었다. 

 

때문에 라이브러리 구조 따위는 전혀 신경쓰지 않고 살아왔다. ㅎㅎㅎ 

그런데 다수인원이 작업하는 프로젝트나 ROS와 같이 규모가 큰 프로젝트에서는 불편한 점들이 어느 정도 있었던 것 같다.

때문에 이번 기회에 Cmake와 라이브러리 구조화를 연습해 보고 넘어가려고 한다.

 

이전글 (2021/01/11 - [Software/C++] - goormIDE에서 g++을 이용한 라이브러리, 실행파일 생성)

 

goormIDE에서 g++을 이용한 라이브러리, 실행파일 생성

필자는 군대 사지방(사이버지식정보방)에서 이것저것 코딩 연습을 하고 있다. 우리 부대의 쾌적한 컴퓨터는 무려 리눅스 기반으로 국내 개발한 '하모니카'라는 OS를 사용하고 있다. 이렇게만 보

allround-maker.tistory.com

이전 글에서 터미널 창에 g++ 명령을 통해 오브젝트 파일( ~~~.o)과 실행파일(a.out)을 생성하였다. 

하지만 여러개의 헤더 파일을 이용해 코드를 작성하게 된다면 그때마다 g++명령을 통해 헤더 파일들을 지정하여 컴파일하는 것은 비 효율적일 것이다. 

때문에 cmake에서는 CMakeLists.txt라는 파일에 컴파일에 필요한 링크(어떤 헤더파일을 컴파일하는 데 사용할지) 정보를 작성하여 저장해둔다.  

 

1. CMake 설치 

$cmake --version

위 명령어를 터미널창에 입력하여 현재 설치되어 있는 cmake의 버전을 확인할 수 있다. 아마 goormIDE 사용자라면 설치되어 있지 않을 것이다. 

 

$sudo apt install cmake

위 명령어를 통해 아주 쉽게 cmake를 설치할 수 있다. 설치 전 sudo apt-get update 정도는 해주는 게 좋다.

설치한 cmake 버전은 3.10.2 이다. 

2. Workspace 생성

좌측 상단 + 버튼을 눌러 서브 프로젝트를 생 성해준 뒤 아래와 같은 파일을 작성해 준다 총 4가지의 파일이다.

//testlib.hpp
#include <iostream>
void yaho_func();
//testlib.cpp
#include <iostream>
#include "testlib.hpp"

using namespace std;
void yaho_func(){
	cout << "ya~ho~" << endl;
}
//main.cpp
#include "testlib.hpp"

int main(){
	yaho_func();
}
#CMakeList.txt
cmake_minimum_required (VERSION 3.10)
project (cmake_first_test)
add_executable (first_test testlib.cpp main.cpp)

위의 4가지 파일을 차례로 작성해 서브 프로젝트 안에 때려 박아 준후 build라는 디렉토리를 만들고 그 안에서 cmake를 실시하면 cmake를 통해 생성되는 파일들은 build 폴더 안에 저장되므로 디렉터리에 못 알아보는 파일들이 들어오는 것을 방지할 수 있다.

 

마지막 CMakeList.txt의 내용을 분석해보면 (사실 별로 분석할게 없다 마지막 줄만 보면 됨 ㅎㅎ)

 

add_executable 명령어는 빌드후 생성할 실행파일에 관한 명령어이다. main.cpp를 포함하여 main.cpp에 include 한 소스파일들을 열거형으로 작성해주면 된다. 

add_executable ( [생성할 실행파일명] [소스파일 1] [소스파일2] [소스파일3]  ...)

두 번째 줄은 프로젝트명, 첫 번째 줄은 말 그대로 cmake의 최소 요구 버전이다. 우리는 3.10.2 버전 cmake를 설치하였으니 이보다 낮은 버전으로 저장하면 실행하는데 문제가 없다.

 

3. cmake 명령어를 통해 Makefile 생성

$/workspace/cmake_test_1/build# cmake ..

cmake 뒤에 붙는 점(..)은 한 단계 상위 디렉토리의 경로를 가리키고 점이 한 개일 경우 해당 디렉토리를 가리킨다.

이렇게 되면 해당 디렉토리에 있는 CMakeLists.txt 라는 파일을 자동으로 선택하여 Makefile을 생성해준다.

( $ls 명령어를 통해 Makefile 생성 확인 가능)

 

4. make 명령어를 통해 빌드 수행

$/workspace/cmake_test_1/build# make

이제 $make 명령어를 통해 빌드를 진행할 수 있다.

추가로 cmake 명령어로 Makefile을 생성하고 나면 헤더 파일이나 메인 파일이 수정되어도 다시 cmake 명령어를  진행할 필요는 없다. 바로 make 명령어만 실행해 주어도 CMakeLists.txt 파일에 변경이 있는지 확인하고 변경을 포함하여 빌드를 진행한다.

5. 실행

빌드가 완료되면 build 디렉토리 안에 first_test 라는 실행파일이 추가된 것을 확인할 수 있다.

아래 명령어를 통해 실행파일을 실행시키면 라이브러리에 생성했던 함수를 호출하여 동작하는 것을 확인할 수 있다.

$/workspace/cmake_test_1/build# ./first_test