1. ホーム
  2. c++

[解決済み] ライブラリの利用方法

2023-04-20 06:14:20

質問

どの言語でも、なぜか外部ライブラリが使えません。外部ライブラリの使用方法、および、外部ライブラリがどのように機能するのかについての説明/解説を探しています。オンラインで検索すると、私がダウンロードして使おうとするどのライブラリにも適用されないような断片が表示されます。私はmacとpcの両方で仕事をしていますが、C++の例題は問題ありません。私は、C++プラグインのあるeclipse IDEを使用しています。すべてのライブラリに適用される命令があるならば、それは素晴らしいことです。

どのように解決するのですか?

例えば、あるクラス Unuseful が以下のように定義されているとします。

ファイル Unuseful.h :

class Unuseful {
public:
    void printUnusefulStatement();
};

ファイル Unuseful.cpp :

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

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

さて、あなたは、役に立たないステートメントを印刷する必要がある別のクラスを持っています。

Unuseful u;
u.printUnusefulStatement();

これは、特定の実装を含む外部ライブラリ( printUnusefulStatement ) を含む外部ライブラリを使用することを意味します。

このライブラリは、2つの方法で使用することができます。

  1. コンパイラにソースコードを提供する方法
  2. アーキテクチャ用にコンパイルされたバイナリファイルをリンカに提供する。

ケース 1: コンパイル時にライブラリを使用する場合

これは最も単純なケースです。 使用するライブラリのソースコードがあり、既存のコードと一緒にコンパイルする必要があるだけです (たとえば main.cpp ファイル) と一緒にコンパイルするだけです。 通常、あなたはライブラリ(あなたが必要とするタスクを達成するクラス)の作者でありユーザーです。

このコマンドでコンパイルします。

g++ main.cpp unuseful.cpp

を使えば、必要な実装を main.cpp ファイルで必要な実装を使うことができます。

ケース2: ライブラリをリンクする

よりも頻繁に ケース 1 の場合、使いたいライブラリのソースコードを持っていない。あなたが持っているのはヘッダーファイル( Unuseful.h というヘッダーファイルがあるだけです。 静的 または 共有 ライブラリ(おそらく[*]。 libunuseful.alibunuseful.so ファイル)をそれぞれ作成します。

静的ライブラリは、オブジェクトファイルのアーカイブ( *.o ) のアーカイブで、最終的な実行ファイルの中でリンクされますが、共有ライブラリは代わりに実行時に動的にロードされます ( このページ を参照してください)。

静的ライブラリは、単純にアーカイブすることで作成されます。 *.o ファイルを ar プログラムを使用します。

# Create the object files (only one here)
g++ -c unuseful.cpp
# Create the archive (insert the lib prefix)
ar rcs libunuseful.a unuseful.o

共有ライブラリの作成は g++ -shared オプションで指定します。

# Create the object file with Position Independent Code[**]
g++ -fPIC -c unuseful.cpp
# Crate the shared library (insert the lib prefix)
g++ -shared -o libunuseful.so unuseful.o

ここで、あなたが Unuseful.h ファイルと共有ライブラリ ( libunuseful.so ファイル) があり、あなたは main.cpp ファイルをインスタンス化し Unuseful オブジェクトを作成し printUnusefulStatement メソッドを呼び出します。

このファイルをコンパイルしようとすると、( g++ main.cpp ) をコンパイルしようとすると、リンカは printUnusefulStatement シンボルが見つからないためです。

ライブラリを使うときが来た。

g++ main.cpp -L. -lunuseful

-L オプションはリンカにライブラリファイルの検索場所を指示し -l フラグは使用するライブラリの名前をリンカに伝えます。 lib を除いたもの) の名前をリンカに伝えます。

これで実行ファイル ( a.out )が作成され、必要な機能を実装するためにライブラリを使っていますね( printUnusefulStatement ).

共有ライブラリはランタイムにロードされるため、実行時に a.out の実行は、システムがライブラリを見つけることができないため、失敗することがあります。 通常、これは動的ライブラリの検索に使用するパスを示す環境変数を適切に設定することで解決できます。

# Set the LD_LIBRARY_PATH [*]
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

完了です。これで実行ファイルがコンパイルされ、必要なライブラリをロードして実行できるようになりました。

まとめ

これは、ライブラリがどのように使用され、他の人に提供されているかを理解する助けになることを願って、ライブラリについての簡単な概要です。

もし興味があれば、より詳細に調査すべき多くの多くの側面があります。 g++ 共有ライブラリ作成時のオプション ar オプション、環境変数、共有ライブラリのフォーマットなどです。

[*]: Unix環境では

[**]: ターゲット マシンでサポートされている場合、ダイナミック リンクに適した位置に依存しないコードを生成し、グローバル オフセット テーブルのサイズに関するいかなる制限も回避します。このオプションは、m68k、PowerPC、SPARC で違いがあります。位置非依存コードは特別なサポートを必要とするため、特定のマシンでしか動作しません。 [g++ マニュアル ページより] 。