QTでDLLの読み込みを遅らせることはできますか?たとえば、私のプログラムにはサードパーティのDLLからの依存関係があり、それを削除したいと思います。
依存関係を削除するには、.proファイルに何を書き込む必要がありますか?
DLLをリソースに保存できますか?
DLLを「グローバルに」ロードできますか?したがって、DLLの一部の関数(たとえば、func1)は、私のコードではfunc1のままになります。
QTでDLLの読み込みを遅らせることはできますか?たとえば、私のプログラムにはサードパーティのDLLからの依存関係があり、それを削除したいと思います。
依存関係を削除するには、.proファイルに何を書き込む必要がありますか?
DLLをリソースに保存できますか?
DLLを「グローバルに」ロードできますか?したがって、DLLの一部の関数(たとえば、func1)は、私のコードではfunc1のままになります。
はい、QLibrary
クラスを使用します。これは、実行時に共有ライブラリをロードするために特別に提供されています。
この場合、.proファイルには何も必要ありません。ただし、DLLがターゲットコンピューターで使用可能であることを確認する必要があります。システムが検出できる場所(Windowsの場合はPATH、Linuxの場合はLD_LIBRARY_PATH、Macの場合はDYLD_LIBRARY_PATH)に配置するか、アプリケーションからの絶対パスを指定する必要があります。
ドキュメントを見ると、「func1()」がライブラリ内の関数を指すように、ライブラリ関数をコード内の関数ポインタにマップする方法がわかります。
[編集]
これは、リソースから生成された一時ファイルからdllをロードするための概念実証です。IMO、これは本当に悪い考えですが、少なくとも私のWindows7マシンでは機能します。同様のことをしたい場合は、一時ファイルのクリーンアップ、重複のチェックなどを処理する必要があります。
foo.cpp、共有ライブラリにコンパイル
#include <QtCore/qglobal.h>
extern "C" Q_DECL_EXPORT int foo(int value) {
return value + 42;
}
bar.pro、fooライブラリへの参照がないことに注意してください
SOURCES += main.cpp
RESOURCES += resources.qrc
main.cpp
#include <QtCore>
#include <iostream>
int main(int argc, char **argv) {
QCoreApplication app(argc, argv);
// Copy resource dll to temporary file.
QFile::copy(":/lib/Foo.dll", QDir::temp().filePath("Foo.dll"));
// Load the temporary file as a shared library.
QLibrary foo_lib(QDir::temp().filePath("Foo.dll"));
typedef int (*FooDelegate)(int);
FooDelegate foo = (FooDelegate)foo_lib.resolve("foo");
if (foo) {
std::cout << "foo(13) = " << foo(13) << std::endl;
}
}
私はMicrosoftコンパイラの観点からしか話すことができません...それは、遅延ロードされたコードやデータにアクセスするタイミングと場所よりも、QTが何を望んでいるかに依存しません。
一般に、DLLがオプションで遅延ロードされ、/delayload:[dllname]
delayimp.libでリンクされていることをリンカに通知する必要があります。.cppファイルにライブラリを追加できます。
#pragma comment(lib, "delayimp")
これにより、リンカーコマンドラインで指定する必要がなくなります。
リンカーコマンドにdelayloadスイッチを追加するために.proファイルに何が入るのかわかりません。
Microsoftのドキュメントについては、このリンクを参照してください。