QLibrary Class
QLibraryクラスは、実行時に共有ライブラリをロードします。詳細...
Header: | #include <QLibrary> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
Inherits: | QObject |
- 継承メンバを含む全メンバのリスト
- QLibraryはプラグインクラスに属しています。
注意:このクラスの関数はすべてリエントラントです。
パブリック型
enum | LoadHint { ResolveAllSymbolsHint, ExportExternalSymbolsHint, LoadArchiveMemberHint, PreventUnloadHint, DeepBindHint } |
flags | LoadHints |
プロパティ
パブリック関数
QLibrary(QObject *parent = nullptr) | |
QLibrary(const QString &fileName, QObject *parent = nullptr) | |
QLibrary(const QString &fileName, const QString &version, QObject *parent = nullptr) | |
QLibrary(const QString &fileName, int verNum, QObject *parent = nullptr) | |
virtual | ~QLibrary() |
QString | errorString() const |
QString | fileName() const |
bool | isLoaded() const |
bool | load() |
QLibrary::LoadHints | loadHints() const |
QFunctionPointer | resolve(const char *symbol) |
void | setFileName(const QString &fileName) |
void | setFileNameAndVersion(const QString &fileName, const QString &version) |
void | setFileNameAndVersion(const QString &fileName, int versionNumber) |
void | setLoadHints(QLibrary::LoadHints hints) |
bool | unload() |
静的パブリック・メンバ
bool | isLibrary(const QString &fileName) |
QFunctionPointer | resolve(const QString &fileName, const char *symbol) |
QFunctionPointer | resolve(const QString &fileName, const QString &version, const char *symbol) |
QFunctionPointer | resolve(const QString &fileName, int verNum, const char *symbol) |
詳細説明
QLibraryオブジェクトのインスタンスは、1つの共有オブジェクト・ファイル(私たちは「ライブラリ」と呼んでいますが、「DLL」とも呼ばれています)を操作します。QLibraryは、プラットフォームに依存しない方法でライブラリ内の機能へのアクセスを提供します。ファイル名はコンストラクタで渡すか、setFileName() で明示的に設定します。ライブラリをロードする際、QLibraryは、ファイル名に絶対パスが指定されていない限り、システム固有のすべてのライブラリの場所(例えば、UnixではLD_LIBRARY_PATH
)を検索します。
ファイル名が絶対パスの場合、このパスを最初にロードしようと試みます。ファイルが見つからない場合、QLibraryはUnixやMacの "lib "のようなプラットフォーム固有の接頭辞や、Unixの".so"、Macの".dylib"、Windowsの".dll "のような接尾辞を持つファイル名を試します。
ファイルパスが絶対パスでない場合、QLibrary は検索順序を変更し、システム固有の接頭辞と接尾辞を最初に試し、その後に指定されたファイルパスを試します。
これにより、ベース名のみで識別される(つまり接尾辞がない)共有ライブラリを指定することができるため、同じコードが異なるオペレーティングシステムでも動作し、なおかつライブラリを見つけるための試行回数を最小限に抑えることができます。
最も重要な関数は、ライブラリ・ファイルを動的にロードするload ()、ロードが成功したかどうかをチェックするisLoaded ()、ライブラリ内のシンボルを解決するresolve ()である。resolve() 関数は、ライブラリがまだロードされていない場合、暗黙的にロードを試みます。複数の QLibrary インスタンスを使用して、同じ物理ライブラリにアクセスできます。一度ロードされたライブラリは、アプリケーションが終了するまでメモリ上に残ります。unload() を使用してライブラリをアンロードしようとすることはできますが、QLibrary の他のインスタンスが同じライブラリを使用している場合、この呼び出しは失敗し、アンロードはすべてのインスタンスがunload() を呼び出したときにのみ行われます。
QLibraryの典型的な使用方法は、ライブラリのエクスポートされたシンボルを解決し、このシンボルが表すC関数を呼び出すことです。これは「暗黙的リンク」と対照的に「明示的リンク」と呼ばれ、実行ファイルをライブラリにリンクする際にビルドプロセスのリンクステップで行われます。
次のコード・スニペットは、ライブラリをロードし、シンボル "mysymbol "を解決し、すべてが成功すれば関数を呼び出します。ライブラリ・ファイルが存在しない、シンボルが定義されていないなど、何か問題が発生した場合、関数ポインタはnullptr
、呼び出されません。
QLibrary myLib("mylib"); typedef void (*MyPrototype)(); MyPrototype myFunction = (MyPrototype) myLib.resolve("mysymbol"); if (myFunction) myFunction();
resolve() が動作するためには、シンボルがライブラリから C 関数としてエクスポートされている必要があります。つまり、ライブラリがC++コンパイラでコンパイルされている場合、関数をextern "C"
ブロックでラップする必要があります。Windowsでは、dllexport
マクロの使用も必要である。この方法の詳細については、resolve ()を参照のこと。便宜上、ライブラリを明示的にロードせずにライブラリ内の関数を呼び出したい場合に使用できる、静的なresolve ()関数があります:
typedef void (*MyPrototype)(); MyPrototype myFunction = (MyPrototype) QLibrary::resolve("mylib", "mysymbol"); if (myFunction) myFunction();
QPluginLoaderも参照のこと 。
メンバ型ドキュメント
enum QLibrary::LoadHint
flags QLibrary::LoadHints
この列挙型は、ライブラリがロードされたときの処理方法を変更するために使用できるヒントを記述します。これらの値は、ライブラリのロード時にシンボルがどのように解決されるかを示すもので、setLoadHints() 関数を使用して指定します。
定数 | 値 | 説明 |
---|---|---|
QLibrary::ResolveAllSymbolsHint | 0x01 | resolve() が呼び出されたときだけでなく、ライブラリがロードされたときに、 ライブラリ内のすべてのシンボルが解決されるようにします。 |
QLibrary::ExportExternalSymbolsHint | 0x02 | ライブラリ内の未解決シンボルや外部シンボルをエクスポートし、後でロードされる他の動的にロードされるライブラリで解決できるようにする。 |
QLibrary::LoadArchiveMemberHint | 0x04 | ライブラリのファイル名で、アーカイブ・ファイル内の特定のオブジェクト・ ファイルを指定できるようにする。このヒントが指定された場合、ライブラリのファイル名は、アーカイブ・ファイルへの参照であるパスと、アーカイブ・メンバーへの参照から構成されます。 |
QLibrary::PreventUnloadHint | 0x08 | close()が呼ばれたときに、ライブラリがアドレス空間からアンロードされるのを防ぐ。後で open() が呼び出されても、ライブラリの静的変数は再初期化されない。 |
QLibrary::DeepBindHint | 0x10 | ロードされたライブラリの外部シンボルを解決するときに、ロードされたアプリケーションのエクスポートされた定義よりも、ロードされたライブラリの定義を優先するようにリンカに指示します。このオプションは Linux でのみサポートされています。 |
LoadHints 型はQFlags<LoadHint> の typedef です。LoadHint 値の OR の組み合わせを格納します。
loadHintsも参照してください 。
プロパティ・ドキュメンテーション
fileName : QString
このプロパティは、ライブラリのファイル名を保持します。
ファイル名の接尾辞は省略することをお勧めします。QLibrary は自動的に適切な接尾辞を持つファイルを探します(isLibrary() を参照)。
ライブラリをロードする際、ファイル名に絶対パスが指定されていない限り、QLibrary はすべてのシステム固有のライブラリの場所(例えば、Unix ではLD_LIBRARY_PATH
)を検索する。ライブラリのロードに成功すると、fileName() はライブラリの完全修飾ファイル名を返します。このファイル名には、コンストラクタでライブラリのフル・パスが指定されている場合や、setFileName() に渡された場合も含まれます。
たとえば、Unixプラットフォームで "GL "ライブラリのロードに成功すると、 fileName()は "libGL.so "を返す。ファイル名がもともと"/usr/lib/libGL "として渡された場合、 fileName()は"/usr/lib/libGL.so "を返す。
関数へのアクセス:
QString | fileName() const |
void | setFileName(const QString &fileName) |
loadHints : LoadHints
load() 関数に、どのように動作するかのヒントを与えます。
シンボルがどのように解決されるかのヒントを与えることができます。通常、シンボルはロード時に解決されるのではなく、遅延的に解決されます(つまり、resolve ()が呼び出されたとき)。loadHints をResolveAllSymbolsHint に設定すると、プラットフォームがサポートしていれば、ロード時にすべてのシンボルが解決されます。
ExportExternalSymbolsHint を設定すると、ライブラリ内の外部シンボルが、それ以降にロードされる ライブラリで解決できるようになります。
LoadArchiveMemberHint を設定すると、ファイル名は2つの要素から構成される:アーカイブ・ファイルへの参照であるパスの後に、アーカイブ・メンバーへの参照である2番目のコンポーネントが続きます。たとえば、fileName libGL.a(shr_64.o)
は、libGL.a
という名前のアーカイブ・ファイル内のライブラリshr_64.o
を参照します。これはAIXプラットフォームでのみサポートされている。
ロード・ヒントの解釈はプラットフォーム依存であり、これを使用する場合 は、おそらくどのプラットフォーム用にコンパイルしているのかを仮定することにな るので、その結果を理解している場合にのみ使用してください。
デフォルトでは、これらのフラグは何も設定されていないため、ライブラリは遅延シ ンボル解決でロードされ、他の動的にロードされるライブラリの解決のために 外部シンボルをエクスポートすることはありません。
注意: ヒントは、このオブジェクトがファイルに関連付けられていない場合にのみクリアできます。ヒントを追加できるのは、ファイル名が設定された後だけです(hints は古いヒントで OR されます)。
注意 : ライブラリがロードされた後にこのプロパティを設定しても効果はなく、loadHints() はその変更を反映しません。
注意: このプロパティは、同じライブラリを参照するすべてのQLibrary インスタンス間で共有されます。
アクセス関数:
QLibrary::LoadHints | loadHints() const |
void | setLoadHints(QLibrary::LoadHints hints) |
メンバ関数ドキュメント
[explicit]
QLibrary::QLibrary(QObject *parent = nullptr)
指定されたparent でライブラリを構築します。
[explicit]
QLibrary::QLibrary(const QString &fileName, QObject *parent = nullptr)
fileName で指定されたライブラリをロードする、指定されたparent を持つライブラリ・オブジェクトを構築します。
fileNameQLibrary は、プラットフォームに応じて適切な接尾辞を持つファイルを自動的に探します(Unix では ".so"、macOS および iOS では ".dylib"、Windows では ".dll")。(fileName を参照)。
[explicit]
QLibrary::QLibrary(const QString &fileName, const QString &version, QObject *parent = nullptr)
与えられたparent でライブラリオブジェクトを構築し、fileName と完全なバージョン番号version で指定されたライブラリをロードする。現在、Windowsではバージョン番号は無視されます。
fileNameQLibrary は、プラットフォームに応じて適切な接尾辞を持つファイルを自動的に探します。例えば、Unixでは".so"、macOSとiOSでは".dylib"、Windowsでは".dll "です。(fileName を参照)。
[explicit]
QLibrary::QLibrary(const QString &fileName, int verNum, QObject *parent = nullptr)
与えられたparent でライブラリオブジェクトを構築し、fileName とメジャーバージョン番号verNum で指定されたライブラリをロードする。現在、Windowsではバージョン番号は無視されます。
fileNameQLibrary は、プラットフォームに応じて適切な接尾辞を持つファイルを自動的に探します。例えば、Unix では ".so"、macOS と iOS では ".dylib"、Windows では ".dll" です。(fileName を参照)。
[virtual noexcept]
QLibrary::~QLibrary()
QLibrary オブジェクトを破棄する。
unload() が明示的に呼び出されない限り、アプリケーション が終了するまでライブラリはメモリ上に残る。
QString QLibrary::errorString() const
最後に発生したエラーの説明をテキスト文字列で返します。現在のところ、errorString が設定されるのは、何らかの理由でload()、unload()、またはresolve() が失敗した場合のみである。
[static]
bool QLibrary::isLibrary(const QString &fileName)
fileName がロード可能なライブラリとして有効なサフィックスを持つ場合はtrue
を返し、そうでない場合はfalse
を返す。
プラットフォーム | 有効なサフィックス |
---|---|
Windows | .dll ,.DLL |
Unix/Linux | .so |
AIX | .a |
HP-UX | .sl .so (HP-UXi) |
macOS と iOS | .dylib .bundle 、.so |
Unixでの末尾のバージョン番号は無視される。
bool QLibrary::isLoaded() const
load() が成功した場合はtrue
を返し、そうでない場合はfalse
を返します。
load()も参照してください 。
bool QLibrary::load()
ライブラリをロードし、ライブラリが正常にロードされた場合はtrue
を返し、そうでない場合はfalse
を返す。resolve() は、シンボルを解決する前に常にこの関数を呼び出すため、明示的に呼び出す 必要はない。状況によっては、事前にライブラリをロードしておきたい場合があり、その場合はこの関数を使用する。
unload()も参照のこと 。
QFunctionPointer QLibrary::resolve(const char *symbol)
エクスポートされたシンボルのアドレスを返すsymbol 。必要に応じてライブラリがロードされます。シンボルを解決できなかった場合、またはライブラリをロードできなかった場合、この関数はnullptr
を返します。
例
typedef int (*AvgFunction)(int, int); AvgFunction avg = (AvgFunction) library->resolve("avg"); if (avg) return avg(5, 8); else return -1;
シンボルは、ライブラリから C 関数としてエクスポートする必要があります。これは、ライブラリがC++コンパイラでコンパイルされている場合、関数をextern "C"
でラップする必要があることを意味します。Windows では、__declspec(dllexport)
コンパイラ指令を使用して、DLL から明示的に関数をエクスポートする必要があります:
extern "C" MY_EXPORT int avg(int a, int b) { return (a + b) / 2; }
としてMY_EXPORT
を定義します。
#ifdef Q_OS_WIN #define MY_EXPORT __declspec(dllexport) #else #define MY_EXPORT #endif
[static]
QFunctionPointer QLibrary::resolve(const QString &fileName, const char *symbol)
これはオーバーロードされた関数です。
ライブラリfileName をロードし、エクスポートされたシンボルsymbol のアドレスを返します。fileName には、プラットフォーム固有のファイル接尾辞; (fileName を参照)を含めてはならないことに注意してください。ライブラリはアプリケーションが終了するまでロードされたままです。
シンボルを解決できなかった場合、またはライブラリをロードできなかった場合、この関数はnullptr
を返します。
resolve()も参照 。
[static]
QFunctionPointer QLibrary::resolve(const QString &fileName, const QString &version, const char *symbol)
これはオーバーロードされた関数です。
完全なバージョン番号version を持つライブラリfileName をロードし、 エクスポートされたシンボルのアドレスsymbol を返す。fileName にはプラットフォーム固有のファイル接尾辞を含めないこと に注意してください(fileName を参照)。version は Windows では無視されます。
シンボルを解決できなかった場合、またはライブラリをロードできなかった場合、この関数はnullptr
を返します。
resolve()も参照 。
[static]
QFunctionPointer QLibrary::resolve(const QString &fileName, int verNum, const char *symbol)
これはオーバーロードされた関数です。
ライブラリfileName をメジャー・バージョン番号verNum でロードし、エクスポートされたシンボルsymbol のアドレスを返します。fileName には、プラットフォーム固有のファイル接尾辞; (fileName を参照)を含めてはならないことに注意。verNum は Windows では無視されます。
シンボルを解決できなかった場合、またはライブラリをロードできなかった場合、この関数はnullptr
を返します。
resolve()も参照 。
void QLibrary::setFileNameAndVersion(const QString &fileName, const QString &version)
fileName プロパティと完全なバージョン番号を、それぞれfileName とversion に設定します。version パラメータは Windows では無視されます。
setFileName()も 参照してください。
void QLibrary::setFileNameAndVersion(const QString &fileName, int versionNumber)
fileName プロパティとメジャー・バージョン番号を、それぞれfileName とversionNumber に設定します。Windows ではversionNumber は無視されます。
setFileName() も参照 。
bool QLibrary::unload()
ライブラリをアンロードし、ライブラリをアンロードできた場合はtrue
を返し、そうでない場合はfalse
を返します。
これはアプリケーション終了時に自動的に行われるため、通常はこの関数を呼び出す必要はない。
他のQLibrary インスタンスが同じライブラリを使用している場合、呼び出しは失敗し、アンロードはすべてのインスタンスがunload()を呼び出したときにのみ行われます。
macOSでは、ダイナミック・ライブラリはアンロードできないことに注意してください。QLibrary::unload() はtrue
を返しますが、ライブラリはプロセスにロードされたままです。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。