QLibrary Class

QLibraryクラスは、実行時に共有ライブラリをロードします。詳細...

ヘッダ #include <QLibrary>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
継承: QObject

注意:このクラスの関数はすべてリエントラントです。

パブリック・タイプ

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::ResolveAllSymbolsHint0x01resolve() が呼び出されたときだけでなく、ライブラリがロードされたときに、 ライブラリ内のすべてのシンボルが解決されるようにします。
QLibrary::ExportExternalSymbolsHint0x02ライブラリ内の未解決シンボルや外部シンボルをエクスポートし、後でロードされる他の動的にロードされるライブラリで解決できるようにする。
QLibrary::LoadArchiveMemberHint0x04ライブラリのファイル名で、アーカイブ・ファイル内の特定のオブジェクト・ ファイルを指定できるようにする。このヒントが指定された場合、ライブラリのファイル名は、アーカイブ・ファイルへの参照であるパスと、アーカイブ・メンバーへの参照から構成されます。
QLibrary::PreventUnloadHint0x08close()が呼ばれたときに、ライブラリがアドレス空間からアンロードされるのを防ぐ。後で open() が呼び出されても、ライブラリの静的変数は再初期化されない。
QLibrary::DeepBindHint0x10ロードされたライブラリの外部シンボルを解決するときに、ロードされたアプリケーションのエクスポートされた定義よりも、ロードされたライブラリの定義を優先するようにリンカに指示します。このオプションは 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() が明示的に呼び出されない限り、アプリケーション が終了するまでライブラリはメモリ上に残る。

isLoaded() および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 を返します。

注意: Qt 6.6以前では、この関数は、load()を呼び出さなくても、同じライブラリ上の別のQLibrary オブジェクトがロードされた場合には、true を返していました。

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 プロパティとフルバージョン番号をそれぞれfileNameversion に設定する。version パラメータは Windows では無視される。

setFileName()も参照のこと

void QLibrary::setFileNameAndVersion(const QString &fileName, int versionNumber)

fileName プロパティとメジャーバージョン番号をそれぞれfileNameversionNumber に設定する。WindowsではversionNumber は無視される。

setFileName()も参照のこと

bool QLibrary::unload()

ライブラリをアンロードし、ライブラリをアンロードできた場合はtrue を返し、そうでない場合はfalse を返します。

これはアプリケーションの終了時に自動的に行われるため、通常はこの関数を呼び出す必要はありません。

他のQLibrary インスタンスが同じライブラリを使用している場合、この呼び出しは失敗し、アンロードはすべてのインスタンスがunload()を呼び出したときにのみ行われます。

macOSでは、ダイナミック・ライブラリはアンロードできないことに注意してください。QLibrary::unload() はtrue を返しますが、ライブラリはプロセスにロードされたままです。

resolve() およびload()も参照してください

© 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.