cmake를 활용하여 windows와 linux 모두에서 빌드 가능한 프로젝트 만들기

31 Jul 2017  Khlee  2 mins read.

개요

이번 글에서는 제목과 같이 cmake 툴을 활용해서 Windows와 Linux 모두에서 빌드할 수 있는 프로젝트를 만들어 볼 것이다. 우선 cmake는 소스코드들과 그 결과물인 바이너리, 라이브러리의 구조를 추상화해서 빌드 플랫폼에 의존적인 Makefile(이나 등등)을 생성해내는 도구이다. 자세한건 여기를 참고하자.

설치

먼저 cmake를 설치한다. https://cmake.org/download/ 이 사이트에서 플랫폼에 맞는 바이너리를 받을 수도 있고 아니면 /blog/blog/Raspberry-Pi-EtherCAT/ 처럼 소스코드를 받아서 직접 빌드할 수도 있다.

$ apt-get install cmake

이렇게 해도 된다.

플랫폼별 분기

예제를 기준으로 Windows와 Linux 각각 플랫폼에 대해 다른 빌드 구조나 소스코드를 선택하는 법과, 실제 빌드를 어떻게 수행하는지 알아볼 것이다.

먼저 cmake의 빌드 구조를 정의한 CMakeLists.txt 파일에서는 현재 빌드 플랫폼이 무엇인지 다음과 같이 확인할 수 있다.

if(WIN32)
    message("win 32 build!")
elseif(UNIX)
    message("linux build!")
endif()

if문과 WIN32, UNIX 키워드를 통해서 확인이 가능하다. Windows 64 타겟으로 빌드할 때에도 WIN32 키워드가 활성화된다. 이 분기문을 통해 각 빌드 플랫폼에 따라 서로 다른 소스코드나 라이브러리를 선택하는 등의 빌드 구조를 정의할 수 있다.

타겟 플랫폼에 따라 소스코드 파일을 따로 작성할 수도 있지만 그 양이 많지 않다면 한 소스파일 내에서 전처리기 매크로로 구분하는 방법도 좋다.

#if defined(_WIN64)
    printf("_WIN64!!\n");
#elif defined(_WIN32)
    printf("_WIN32!!\n");
#elif defined(__linux__)
    printf("__linux__");
    if(sizeof(long int) == 8)
    {
        printf("64!!\n");
    }
    else
    {
        printf("32!!\n");
    }
#endif

빌드

마지막으로 각 플랫폼에서의 빌드 방법이다. 먼저 Linux에서는

$ mkdir build
$ cd build
$ cmake ..
$ make

이렇게 하면 된다.

Windows에서는 조금 더 복잡하다. 우선 Visual Studio를 설치해야 한다. cmd.exe나 Visual Studio 명령 프롬프트를 열어서 다음과 같이 명령어를 입력한다.

> mkdir build
> cd build
> "C:\Program Files\CMake\bin\cmake.exe" .. -G "Visual Studio 15 2017 Win64"
> "C:\Program Files\CMake\bin\cmake.exe" --build . --config Release

cmake.exe의 경로는 자신의 환경에 맞게 바꾸면 되고, 자신이 설치한 Visual Studio 버전에 따라 3번째 명령어를 다르게 하면 된다. cmake.exe -G 명령어를 실행하면 큰 따옴표 사이에 넣을 수 있는 내용이 쭉 나온다. 여기서 알맞은 것을 선택하면 된다.

cmake targets

엄청 많이 나온다. Makefile뿐만 아니라 각 IDE의 프로젝트를 그냥 생성해준다.

Visual Studio에 있는 [arch] 부분에는 32비트 타겟으로 빌드할 경우 생략, 64비트 타겟으로 빌드할 경우 WIN64라고 입력해주면 된다.

khlee
khlee