とあるプロジェクトで共有ライブラリを利用してコンパイルを行うことにした。
しかし、作成方法から分かっておらず、初心者なりに試行錯誤して解決したので、それを備忘録として残しておく。
環境
ubuntu18.04
g++ 7.3.0
##1. 共有ライブラリって?
汎用性が効くプログラムの集まり。
共有ライブラリがあれば様々なプログラムから簡単に呼び出せる。
Linuxでは.so
Windowsでは.dll
という拡張子になっている。
##2. 作成方法
簡単な例を用いて説明する。
共有したい関数をhoge()としてプログラムを書くと、
#include <iostream>
using namespace std;
void hoge(void) {
cout << "Hello,World!" << endl;
}
これを共有ライブラリにコンパイルを行う。
$ g++ -shared -fPIC -o share.so share.cpp
-shared これは共有ライブラリを作成するオプション。
-fPIC これはプログラムの再配置回数を少なくして、実行速度の高速化を行うオプション。
間違ってたら連絡をください。
##3. 使用方法
私が一番苦労したところだ。
私の環境ではネットの文献を写経してもうまく動作しなかった。
この記事のメインはここである。
まずは共有ライブラリを利用するためのヘッダーファイルとプログラム本体を提示する。
void hoge();
#include "share.h"
int main() {
hoge();
return 0;
}
ではコンパイルを共有ライブラリを利用して行う。
$ g++ -o main main.cpp share.so
これを実行するとmainという名前の実行ファイルが出力される。
これを実行すると
Hello,World!
と表示される。
##4. まとめ
ネットの文献では
$ g++ -o main share.so main.cpp
と書かれている。これを実行しても
undefined reference to `hoge()'
とエラーを吐かれてしまう。また、
$ g++ -o main share.so -c main.cpp
では
g++: warning: share.so: linker input file unused because linking not done
と吐かれ実行ファイルが出力されない。
g++ 7.X では文法が変わったのか?
詳しい方はご教授お願いします。
ありがとうございました。