web-dev-qa-db-ja.com

ライブラリの使用方法

何らかの理由で、どの言語でも外部ライブラリを使用することはできません。外部ライブラリの使用方法とその動作方法の説明/説明を探しています。オンラインで検索すると、ダウンロードして試して使用するライブラリに適用されないフラグメントが表示されます。私はMacとPCの両方で作業していますが、C++の例でも問題ありません。 Eclipse IDEとC++プラグインを使用します。すべてのライブラリに適用される指示があれば素晴らしいでしょう。

62
sinθ

次のように定義されたクラス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、例を続行する)とstaticまたはsharedライブラリ(それぞれ[*] libunuseful.aおよびlibunuseful.soファイル)のみがあります。

静的ライブラリは、最終的な実行可能ファイル内でリンクされているオブジェクトファイル(*.o)のアーカイブであり、代わりに共有ライブラリが動的にロードされます-実行時に(違いをよりよく理解するために このページ を見てください) )。

静的ライブラリは、arプログラムで*.oファイルをアーカイブするだけで作成されます。

# 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ファイル)があり、Unusefulオブジェクトをインスタンス化してprintUnusefulStatementメソッドを呼び出すmain.cppファイルがあるとします。

このファイル(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 ++ manページから]

152
Vincenzo Pii

ここから始めます http://en.wikipedia.org/wiki/Library_(computing)

基本的に、「ライブラリ」はコンパイルされた関数とクラス宣言のコレクションです。

Macには、Pascalのユニットに多少似ており、宣言とコンパイルされたコードの両方を含む「フレームワーク」もあります。

JavaまたはC#のようなマネージ言語には、パッケージとアセンブリがあります。どちらもライブラリと密接に関連しています。

CまたはC++でライブラリを使用するには、.libファイル(またはほとんどのPOSIXまたはGCCツールチェーンベースのコンパイラの場合は.aファイル)と、.libファイルにコンパイルされる関数のプロトタイプが必要です。開発環境によって異なります(Eclipseの場合、GCCコンパイラとGNU toolchain with LDリンカ)を使用する可能性が高いため、ライブラリファイルを指定するだけです( libまたは.a)リンカへの入力としてほとんどの場合、ライブラリには関数プロトタイプの定義を含むヘッダーファイルが付属しています。

リンカーについて知らなかったとしても、それは奇妙なことですが、ライブラリはプログラムで暗黙的に使用されます-std :: coutはlibstdc ++またはCランタイムライブラリにあります。

巨大なライブラリと便利なC++クラスのセットの例として、Boostをご覧ください。

WindowsでGUIを作成するには、MSDNで説明されているWinAPIを使用できます。

MacでGUIを作成するには、WinAPIに似たCarbon APIを使用できますが、現在は廃止されています。 MacOS用の「正当な」GUIを記述する唯一の方法は、CocoaとObjective-Cを使用することです。

クロスプラットフォームGUIを作成するには、Qt、wxWidgets、GTKなどの多くのライブラリを使用できます。

最後の、しかし少なくとも。 C++はGUIに最適な言語ではありません。

6
Viktor Latypov

外部C++ライブラリを使用する最良の方法は、C++パッケージマネージャーを使用することです。

それらのいくつかはCMakeの使用を必要とします。その上でよく書かれたチュートリアルを見つけることができます こちら

1
adem