3

QTでDLLの読み込みを遅らせることはできますか?たとえば、私のプログラムにはサードパーティのDLLからの依存関係があり、それを削除したいと思います。

依存関係を削除するには、.proファイルに何を書き込む必要がありますか?

DLLをリソースに保存できますか?

DLLを「グローバルに」ロードできますか?したがって、DLLの一部の関数(たとえば、func1)は、私のコードではfunc1のままになります。

4

2 に答える 2

6

はい、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;
  }
}
于 2012-04-12T14:09:34.397 に答える
3

私はMicrosoftコンパイラの観点からしか話すことができません...それは、遅延ロードされたコードやデータにアクセスするタイミングと場所よりも、QTが何を望んでいるかに依存しません。

一般に、DLLがオプションで遅延ロードされ、/delayload:[dllname]delayimp.libでリンクされていることをリンカに通知する必要があります。.cppファイルにライブラリを追加できます。

#pragma comment(lib, "delayimp")

これにより、リンカーコマンドラインで指定する必要がなくなります。

リンカーコマンドにdelayloadスイッチを追加するために.proファイルに何が入るのかわかりません。

Microsoftのドキュメントについては、このリンクを参照してください。

于 2012-04-12T14:20:06.520 に答える