LoginSignup
6
5

More than 3 years have passed since last update.

CMake on DockerでC++コードを簡単ビルド

Last updated at Posted at 2020-01-26

はじめに

  • WindowsPC上で、Linuxに対応したCppプロジェクトを作成したい
  • CMakeのDockerコンテナを探しても見つからなかったので今回作成した

良い点

  • ローカルフォルダをマウントするよう設定
    • ローカルフォルダ上でコードを編集すると、すぐにコンテナへ変更が反映される
    • コンテナにログインせずとも、VS code などのエディタで編集できる
    • ビルド後のファイルもdocker cp コマンドを使わずに取り出せる

ダウンロード

  • この記事で紹介したDocker imageは、DockerHub からダウンロードすることができます。

活用例

  • ①cppフォルダ内に、.cppファイルやCMakeLists.txtを置く
    • VSCodeなど、自分の使い慣れたエディタで編集する
  • ②コンテナ内に入り、ビルド実行
  • ③ビルド後のファイルは、ローカル環境のcppフォルダから取り出すことができる image.png

フォルダ構成

  • 下図のようにDockerfile, docker-compose.ymlを配置する
    • ソースコードは記事の下部に記載
  • cppフォルダは、docker-compose up によって自動生成される
    • このフォルダ内に ソースコードを置く
tree
フォルダ構成
├── Dockerfile
├── docker-compose.yml
└── cpp  ← 自動生成される

Dockerfile

Dockerfile
FROM ubuntu:18.04

RUN apt-get update && apt-get -y upgrade && \
    apt-get install -y sudo && \
    apt-get install -y build-essential && \
    apt-get install -y vim && \
    apt-get install -y wget && \
    apt-get install -y unzip && \
    apt-get install -y git && \
    apt-get install -y libssl-dev

# Install compilers.
RUN apt-get install -y gcc && \
    apt-get install -y g++

# SET path to compilers.
# https://stackoverflow.com/questions/17275348/how-to-specify-new-gcc-path-for-cmake
ENV CC=/usr/bin/gcc \
    CXX=/usr/bin/g++

# Install newer CMake manually
# https://qiita.com/hyasuda/items/16c21458f0ecd08db857
RUN cd $HOME && \
    wget https://github.com/Kitware/CMake/releases/download/v3.17.1/cmake-3.17.1.tar.gz && \
    tar zxvf cmake-3.17.1.tar.gz && \
    cd cmake-3.17.1/ && \
    ./bootstrap && \
    make -j12 && sudo make install -j8
RUN echo 'export PATH=$HOME/cmake-3.17.1/bin/:$PATH' >> ~/.bashrc && \
    . ~/.bashrc

# OpenBlas, Lapack
RUN apt-get install -y libopenblas-dev && \
    apt-get install -y liblapack-dev

# Please use below directory to install cpp libraries.
WORKDIR $HOME/usr/
RUN mkdir ./library

CMD bash

docker-compose.yml

docker-compose.yml
version: '3'

services:
  cmake:
    container_name: cmake_container
    build:
      context: .
      dockerfile: Dockerfile

    tty: true
    command: /bin/bash

    volumes:
      - ./cpp:/usr/cpp

使い方

コンテナの起動

ローカル環境
# コンテナの初回起動
docker-compose up -d

# 起動中のコンテナに入る
docker-compose exec cmake bash

ソースコードのコンパイル

@make_container
# コンテナ内のcppフォルダに入る
cd cpp

# build フォルダを作成し入る
mkdir build
cd build

# cmakeの実行
cmake ../

# makeの実行
make

注意点

  • OS依存のライブラリは、cppフォルダ内で展開・インストールしないでください
    • 筆者は以下のエラーメッセージが表示され、コンテナのマウントが解除されてしまいました。
    • docker compose error while creating mount source path...
    • 依存ライブラリはコンテナ内で別フォルダを作り、そこにインストールしてください
      • 例) OpenCV

チュートリアル

  • 以下では、Hello CMake!と書かれたソースコードをビルドするまでをご紹介します。
  • cppフォルダ内に以下の2つのファイルを作成してください。
cppフォルダ内の構成
cpp
├── main.cpp
└── CMakeLists.txt
  • 各ファイルに以下の内容をコピーしてください。
main.cpp
#include <iostream>
#include <string>

int main(void){
    std::cout << "Hello CMake!" << std::endl;
    return 0;
}
CMakeLists.txt
# プロジェクト名
project("testCMake")

# CMakeのバージョンを設定
cmake_minimum_required(VERSION 2.8)

# testCMake.outという実行ファイルをmain.cppから作成
add_executable(testCMake main.cpp)
  • 次に、コンテナでのビルド作業に入ります。
  • 以下のコマンドを順に入力してビルドします。
@cmake_container
# コンテナ内のcppフォルダに入る
cd cpp

# ビルドフォルダを作る
mkdir build
cd build

# ビルド実行
cmake ../
make
  • 最後にビルドしたプログラムを走らせてみましょう!
    • ./testCMakeと入力し、Hello CMake!と出力されれば成功です。
@cmake_container
./testCMake 
Hello CMake!
6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5