C/C++ ビルドとその他諸々(CMake)
実験でボリュームレンダリングを行う際にV3というツール用することになったのですが、用意されていたシェルスクリプト(C++ファイル群をビルドしてくれるやつ)がうまく動かなかったのでCmakeを使用しないといけなった.使用方法などがあやふやだったため、ビルドなどの基礎知識からまとめ直してみた.
ビルドの流れ
1.プリプロセッサ
2.コンパイラ
3.アセンブラ
4.リンカ
それぞれの場所での処理
プリプロセッサ
プリプロセッサでは行われるのは以下の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