12
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

C++の共有ライブラリに苦戦。。。

Last updated at Posted at 2019-04-09

とあるプロジェクトで共有ライブラリを利用してコンパイルを行うことにした。
しかし、作成方法から分かっておらず、初心者なりに試行錯誤して解決したので、それを備忘録として残しておく。

環境
ubuntu18.04
g++ 7.3.0

##1. 共有ライブラリって?
汎用性が効くプログラムの集まり。
共有ライブラリがあれば様々なプログラムから簡単に呼び出せる。
Linuxでは.so
Windowsでは.dll
という拡張子になっている。

##2. 作成方法
簡単な例を用いて説明する。

共有したい関数をhoge()としてプログラムを書くと、

share.cpp
#include <iostream>

using namespace std;

void hoge(void) {
    cout << "Hello,World!" << endl;
}

これを共有ライブラリにコンパイルを行う。

$ g++ -shared -fPIC -o share.so share.cpp

-shared これは共有ライブラリを作成するオプション。
-fPIC これはプログラムの再配置回数を少なくして、実行速度の高速化を行うオプション。
間違ってたら連絡をください。

##3. 使用方法
私が一番苦労したところだ。
私の環境ではネットの文献を写経してもうまく動作しなかった。
この記事のメインはここである。

まずは共有ライブラリを利用するためのヘッダーファイルとプログラム本体を提示する。

share.h
void hoge();
main.cpp
#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 では文法が変わったのか?
詳しい方はご教授お願いします。

ありがとうございました。

12
12
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?