はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

CMakeを初めて使ってみる(実行ファイル、静的ライブラリ、動的ライブラリ)

はじめに

今回はCMakeを初めて触ってみるという記事です。

CMake is a tool to manage building of source code. Originally, CMake was designed as a generator for various dialects of Makefile, today CMake generates modern buildsystems such as Ninja as well as project files for IDEs such as Visual Studio and Xcode.

CMake Reference Documentation — CMake 3.24.0-rc1 Documentation

// DeepL翻訳
CMakeはソースコードのビルドを管理するためのツールです。元々、CMakeは様々なMakefileの方言の生成ツールとして設計されましたが、今日ではNinjaのような最新のビルドシステムや、Visual StudioやXcodeのようなIDE用のプロジェクトファイルの生成も行っています。

最初に言っておくと、私自身まだ分かっていないことが多くかなり自己満足的な記事になっているのであしからず。

インストール

Homebrewを使える環境ならば以下のコマンドを打つだけです。

$ brew install cmake

準備

以下のファイルを用意しました

.
|--- sample.hpp
|--- sample.cpp
|--- main.cpp
// sample.hpp
#ifndef SAMPLE_H
#define SAMPLE_H

void method();

#endif
// sample.cpp
#include <iostream>
#include "sample.hpp"

void method(){
    std::cout << "Hello, World!" << std::endl;
}
// main.cpp
#include "sample.hpp"

int main(){
    method();
}

お手製ビルド

まずはCMakeを利用せずに自分でg++を利用してビルドを行ってみます。

オブジェクトファイル生成

.cppファイルを一度.oへのビルドを行います。

g++ -c main.cpp sample.cpp

するとmain.osample.oが新しく生成されるはずです。

.
|--- sample.hpp
|--- sample.cpp
|--- sample.o
|--- main.cpp
|--- main.o


この.oというのはオブジェクトファイルのことを指します。

コンピュータプログラムを作成する際、通常はまず人間が記述・解釈しやすいプログラミング言語を用いてプログラムを作成する。これをソースコードという。

これはそのままではコンピュータ(のCPU)が解釈・実行することはできないため、機械が理解できる機械語(マシン語)などで書かれたオブジェクトコード(バイナリコード)に変換する必要がある。この工程はコンパイラなどのソフトウェアを用いて行うことが多く、変換後のコードをファイルに記録したものをオブジェクトファイルという。

ソースコードから変換してすぐのオブジェクトファイルはそのまま起動・実行可能なファイル形式とは限らず、多くの場合はリンカなどのソフトウェアによってライブラリなど他のオブジェクトファイルを連結したり、起動用のコードを先頭に付加するなどして、単体で実行可能なファイル(実行ファイル、ロードモジュールなどを呼ばれる)を作成する。

https://e-words.jp/w/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB.html

実行ファイル生成

あとはリンクして実行ファイルを生成すれば完了です。

$ g++ -o a.out main.o sample.o
.
|--- sample.hpp
|--- sample.cpp
|--- sample.o
|--- main.cpp
|--- main.o
|--- a.out

このa.outが最終的な実行ファイルで、以下のようにコマンドを打つと実行できるはずです。

$ ./a.out
Hello, World!

ソースコードから実行ファイルを生成する

.oを毎回生成するのも面倒ですが、以下のようなコマンドを打てばソースコードから一気に実行ファイルが生成されます。

$ g++ main.cpp sample.cpp
生成の流れ

CMakeを使ったビルド

CMakeを利用するには、CMakeLists.txtというテキストを作成する必要があるそうです。

実行ファイルの生成

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

# a.outという実行ファイルをmain.cppとsample.cppから作成
add_executable(a.out main.cpp sample.cpp)

そうしたら以下のコマンドを打ち込みます。

$ cmake -S . -B build
$ cmake --build build

無事に実行が終了するとbuildフォルダが生成され、中にa.outを出力されているはずです。

.
|--- sample.hpp
|--- sample.cpp
|--- main.cpp
|--- CMakeLists.txt
|--- build
      |--- a.out
      |--- その他もろもろ

静的ライブラリの作成

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

#sample.cppから動的ライブラリを生成する
add_library(mylib STATIC sample.cpp)

Mac上では.aが生成されました。

.
|--- sample.hpp
|--- sample.cpp
|--- main.cpp
|--- CMakeLists.txt
|--- build
      |--- libmylib.a
      |--- その他もろもろ

動的ライブラリの作成

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

#sample.cppから動的ライブラリを生成する
add_library(mylib SHARED sample.cpp)

Mac上では.dylibが生成されました。

.
|--- sample.hpp
|--- sample.cpp
|--- main.cpp
|--- CMakeLists.txt
|--- build
      |--- libmylib.dylib
      |--- その他もろもろ

ひとこと

今回は本当に触りの部分しかできていませんが、一応iOS用のstatic library作成あたりもやりたいと思っているのでまた関連の記事を書くかもです。