芽萌丸プログラミング部 @programming
@programming
2021/2/8 11:40 更新✏

C++で共有ライブラリの作成&利用

C++で共有ライブラリ(.soファイル)の作り方と利用方法のメモです。

目次:

前提

プロジェクト構成

今回のサンプルのプロジェクト構成です:

共有ライブラリ作成

共有ライブラリのサンプルコードです。

lib/header/Hello.h (共有ライブラリのヘッダ)

#ifndef HELLO_H
#define HELLO_H

class Hello {
public:
  void say();
};

#endif

lib/Hello.cpp (共有ライブラリの実装)

#include "header/Hello.h"
#include <iostream>

void Hello::say() {
  std::cout << "Hello world!" << std::endl;
}

-sharedを付けてコンパイル:

$ g++ -shared -fPIC -o lib/libHello.so lib/Hello.cpp

上記コマンドでlib/libHello.soという共有ライブラリが出力されます。

共有ライブラリ利用テストコード

先ほど作成した共有ライブラリ lib/libHello.so を利用してみましょう。

libHello-test.cpp

#include "lib/header/Hello.h"

int main(int argc, char* argv[]) {
    Hello* hello = new Hello();
    hello->say(); // Hello world!
}

POINT: 上記コードの冒頭の#include "lib/header/Hello.h"で今回の共有ライブラリのヘッダファイルを読み込んでいます。これはつまり共有ライブラリ本体(.soファイル)の他にコンパイル時にヘッダが必要になるということです。

コンパイル&実行:

## 共有ライブラリを指定してコンパイル:
$ g++ -o a.out libHello-test.cpp lib/libHello.so

## 実行:
$ ./a.out
Hello world! ## <== 共有ライブラリのメソッドを実行できました!

NOTE: 共有ライブラリの移動に注意!

以下のように、ビルド後に共有ライブラリファイルを削除or移動するとビルド済みのアプリケーション(a.out)から共有ライブラリを読み込めなくなりますのでご注意を:

## 作成した共有ライブラリを削除してみる:
$ rm lib/libHello.so

## 再び実行してみるとエラー発生:
$ ./a.out
./a.out: error while loading shared libraries: lib/libHello.so: cannot open shared object file: No such file or directory

以上です。

関連

C++

芽萌丸プログラミング部 @programming
芽萌丸プログラミング部@programming
プログラミング関連アカウント。Web標準技術を中心に書いていきます。フロントエンドからサーバサイドまで JavaScript だけで済ませたい人たちの集いです。記事は主に @TanakaSoftwareLab が担当。
オススメ:Zattoyomiで時事ネタチェックの時間節約!