88

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

4

3 に答える 3

200

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ファイルと共有ライブラリ ( file 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++ の man ページより]

于 2012-04-27T23:01:35.067 に答える
6

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

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

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

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

C または C++ でライブラリを使用するには、.lib ファイル (ほとんどの POSIX または GCC ツールチェーン ベースのコンパイラでは .a ファイル) と、.lib ファイルにコンパイルされる関数のプロトタイプが必要です。開発環境 (Eclipse の場合、GCC コンパイラーと GNU ツールチェーンを 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 に最適な言語ではありません。

于 2012-04-27T22:50:42.967 に答える