C++を学ぶ

Update 2024.12.25

C++を学ぶ

C++を学ぶ続編です。

ライブラリと、使う側のお作法を知りたい。

ということで下記に掲載。

C++のライブラリと呼び出し方、Makeの使い方

C++で複数のソースコードを分割して管理する場合、共通処理を「ライブラリ化」することで、再利用性が高まり、ビルドも楽になります。
ここでは、簡単なライブラリの作り方と、そのライブラリを呼び出すソースコード、さらにMakeを使ったビルド手順を解説します。

1. ヘッダファイル (mylib.h)

まずはライブラリが提供する関数などの宣言を含むヘッダファイルを作成します。以下は「整数を加算する関数 add と、挨拶をする関数 greet」を提供する例です。


#ifndef MYLIB_H
#define MYLIB_H

#include <string>

// 整数を加算する関数
int add(int a, int b);

// 名前を受け取り、コンソールに挨拶を表示する関数
void greet(const std::string &name);

#endif // MYLIB_H

2. ライブラリ本体 (mylib.cpp)

上記ヘッダファイルで宣言した関数の実装を、このソースファイルに書きます。


#include "mylib.h"
#include <iostream>

int add(int a, int b) {
  return a + b;
}

void greet(const std::string &name) {
  std::cout << "Hello, " << name << "!" << std::endl;
}

3. ライブラリを呼び出す側 (main.cpp)

ライブラリを使うソースファイルでは、先ほどの mylib.h をインクルードして、提供される関数を呼び出します。


#include <iostream>
#include "mylib.h"

int main() {
  int result = add(3, 5);
  std::cout << "3 + 5 = " << result << std::endl;

  greet("Taro");
  return 0;
}

4. Makefile の例

Makefile を使うと、コマンド一発でコンパイルからリンクまで処理できるようになります。
最小限の例として、mylib.omain.o を別々にコンパイルし、main という実行ファイルを生成する方法を示します。


# Makefile (例)

# 使用するコンパイラ
CXX = g++
# コンパイル時のオプション (C++17指定と警告有効化)
CXXFLAGS = -std=c++17 -Wall

# ターゲット(最終的に生成したいファイル)
TARGET = main

# 依存するオブジェクトファイル
OBJS = main.o mylib.o

# make を実行したとき、デフォルトで呼ばれるルール
all: $(TARGET)

# 実行ファイルの生成ルール
$(TARGET): $(OBJS)
  $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS)

# main.o の生成ルール
main.o: main.cpp mylib.h
  $(CXX) $(CXXFLAGS) -c main.cpp

# mylib.o の生成ルール
mylib.o: mylib.cpp mylib.h
  $(CXX) $(CXXFLAGS) -c mylib.cpp

# 中間ファイルや実行ファイルの削除ルール
clean:
  rm -f $(TARGET) *.o

上記の Makefile では、make を実行すると main.omylib.o がコンパイルされ、最後にそれらをリンクして main が作成されます。
make clean を実行すると、生成物(オブジェクトファイルや実行ファイル)を削除できます。

5. ビルドと実行の流れ

  1. ソースを用意: mylib.h, mylib.cpp, main.cpp, Makefile
  2. コンパイル: ターミナルで make を実行
  3. 実行ファイル生成: main が生成される
  4. プログラム実行: ./main(Linux/macOS)あるいは main.exe(Windows)
  5. クリーン: make clean で生成物を削除

6. 静的ライブラリ/共有ライブラリへの応用

今回はオブジェクトファイルを一緒にリンクして実行ファイルを作成しましたが、以下のようにして、ライブラリ として分離することもできます。

  • 静的ライブラリ: libmylib.a
  • 共有ライブラリ(動的ライブラリ): libmylib.so (Linux) や libmylib.dylib (macOS) など

ただし、Makefileの書き方はやや異なります。たとえば静的ライブラリを作成する際は、
ar rcs libmylib.a mylib.o でアーカイブ化し、リンク時に -L.-lmylib オプションを指定します。

まとめ

  1. ヘッダファイル (mylib.h) に関数やクラスの宣言を書く
  2. ライブラリ本体 (mylib.cpp) で実装を書く
  3. 呼び出し側 (main.cpp) ではヘッダをインクルードしてライブラリ関数を利用
  4. Makefile でビルド手順を自動化し、make コマンドで一括コンパイル
  5. ライブラリ化(静的/共有)によってさらなる再利用性やリンク方法を柔軟にすることが可能

これらを踏まえて複数のソースファイルを効率的に管理すれば、C++開発をスムーズに進められます。
Makefileを活用すると、大規模プロジェクトでもビルドの管理が楽になりますので、ぜひ試してみてください。

 

次はvisualstudioで作成方法を知りたいところ。

広告

アフィリエイト広告のスペース