C/C++ ビルドとその他諸々(CMake)

実験でボリュームレンダリングを行う際にV3というツール用することになったのですが、用意されていたシェルスクリプトC++ファイル群をビルドしてくれるやつ)がうまく動かなかったのでCmakeを使用しないといけなった.使用方法などがあやふやだったため、ビルドなどの基礎知識からまとめ直してみた.

ビルドの流れ

1.プリプロセッサ

2.コンパイラ

3.アセンブラ

4.リンカ

それぞれの場所での処理

プリプロセッサ

プリプロセッサでは行われるのは以下の2つ

  1. コメントの削除

  2. #include#defineなどのプリプロセッサディレクティブの解決

ヘッダファイルが複数回includeされることを防ぐために#pragma onceを用いる

コンパイラ

アセンブラ言語への変換が行われる. アセンブラ言語とは機械語を人間にわかりやすい形で記述する、代表的な低水準言語.

また、プリプロセッサの段階では外部参照している関数などはヘッダーファイルにあるプロトタイプ宣言などにより定義だけをメインファイルで参照しているため、実装は未定義

アセンブラ

アセンブラファイルを機械語のファイルに変換する(オブジェクトファイル、バイナリファイル

リンカ

全てのオブジェクトファイルの連結を行う. リンカはmain関数のあるオブジェクトファイルから、未解決の外部参照の実装を探索する

CMakeを使用してみる

以下のコードをcmakeを使用してビルドしていく

サンプルコード

//main.cpp
#include "hello.hpp"
int main() {
    hello();
}
//hello.hpp
#ifndef HELLO_H
#define HELLO_H
void hello();
#endif
}
//hello.cpp
#include <iostream>
#include "hello.hpp"
void hello() {
    std::cout << "Hello!" << std::endl;
}

CMakeの下準備

CMakeを使ったビルドの設定はCMakeLists.txtというテキストファイルに記述する必要がある.またCMakeを使ってビルドするときは、必ずソースディレクトリとは別にビルド専用のディレクトリを作成し、その中でビルドを行う.

  • CMakeLists.txt
# CMakeのバージョン
# cmake --versionで確認
cmake_minimum_required(VERSION 3.10)
# プロジェクト名と使用する言語を設定
project(test_cmake CXX)
# a.outという実行ファイルをmain.cppとhello.cppから作成
add_executable(a.out main.cpp hello.cpp)
---/
 |-CMakeLists.txt
 |-main.cpp
 |-hello.hpp
 |-hello.cpp
 |-build/
    |-a.out
    |...(その他色々)

まとめ

必要な状況になったら静的ライブラリが絡む部分もちゃんと今後学んでいきたい.(必要にならないとやってもなぁなぁで終わってしまう傾向がある..)Cmakeのチュートリアルもあるから機会があればやってと思う

参考

https://qiita.com/shohirose/items/45fb49c6b429e8b204ac https://qiita.com/osamu0329/items/7de2b190df3cfb4ad0ca#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB https://kamino.hatenablog.com/entry/c%2B%2B-principle-of-build-library#sec1