この記事は最終更新日から1年以上が経過しています。
@programming
投稿日 2021/2/8
更新日 2021/2/8 ✏
C++で共有ライブラリの作成&利用
C++で共有ライブラリ(.soファイル)の作り方と利用方法のメモです。
目次:
前提
- Ubuntu 16.04 LTS
- g++ 7.5.0
プロジェクト構成
今回のサンプルのプロジェクト構成です:
- lib/header/Hello.h (共有ライブラリヘッダコード)
- lib/Hello.cpp (共有ライブラリ実装コード)
- libHello-test.cpp (共有ライブラリ読込テストコード)
共有ライブラリ作成
共有ライブラリのサンプルコードです。
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
以上です。