[解決済み] ライブラリの利用方法
質問
どの言語でも、なぜか外部ライブラリが使えません。外部ライブラリの使用方法、および、外部ライブラリがどのように機能するのかについての説明/解説を探しています。オンラインで検索すると、私がダウンロードして使おうとするどのライブラリにも適用されないような断片が表示されます。私は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: コンパイル時にライブラリを使用する場合
これは最も単純なケースです。
使用するライブラリのソースコードがあり、既存のコードと一緒にコンパイルする必要があるだけです (たとえば
main.cpp
ファイル) と一緒にコンパイルするだけです。
通常、あなたはライブラリ(あなたが必要とするタスクを達成するクラス)の作者でありユーザーです。
このコマンドでコンパイルします。
g++ main.cpp unuseful.cpp
を使えば、必要な実装を
main.cpp
ファイルで必要な実装を使うことができます。
ケース2: ライブラリをリンクする
よりも頻繁に
ケース 1
の場合、使いたいライブラリのソースコードを持っていない。あなたが持っているのはヘッダーファイル(
Unuseful.h
というヘッダーファイルがあるだけです。
静的
または
共有
ライブラリ(おそらく[*]。
libunuseful.a
と
libunuseful.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++ マニュアル ページより] 。
関連
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] Windowsにpipをインストールするにはどうしたらいいですか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み】WindowsでTCPまたはUDPポートをリッスンしているプロセスを見つけるにはどうすればよいですか?
-
[解決済み】Windowsで "make "をインストールして使うには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件