QLibrary Class
QLibraryクラスは、実行時に共有ライブラリをロードします。詳細...
ヘッダ | #include <QLibrary> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
継承: | QObject |
- 継承されたメンバーを含む全メンバーのリスト
- QLibraryはPlugin Classesの一部です。
注意:このクラスの関数はすべてリエントラントです。
パブリック・タイプ
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)
与えられたparent でライブラリオブジェクトを構築し、fileName で指定されたライブラリをロードします。
fileNameQLibrary は、プラットフォームに応じて適切な接尾辞を持つファイルを自動的に探します(Unix では ".so"、macOS と iOS では ".dylib"、Windows では ".dll")。(fileName を参照)。
[explicit]
QLibrary::QLibrary(const QString &fileName, const QString &version, QObject *parent = nullptr)
fileName と完全なバージョン番号version で指定されたライブラリをロードする、与えられたparent を持つライブラリオブジェクトを構築する。現在のところ、Windowsではバージョン番号は無視されます。
fileNameQLibrary は、プラットフォームに応じて適切な接尾辞を持つファイルを自動的に探します(Unixでは ".so"、macOSとiOSでは ".dylib"、Windowsでは ".dll")。(fileName を参照)。
[explicit]
QLibrary::QLibrary(const QString &fileName, int verNum, QObject *parent = nullptr)
fileName とメジャーバージョン番号verNum で指定されたライブラリをロードする、与えられたparent を持つライブラリオブジェクトを構築する。現在、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)
これはオーバーロードされた関数です。
ライブラリfileName を完全なバージョン番号version でロードし、エクスポートされたシンボル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
を返しますが、ライブラリはプロセスにロードされたままです。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.