2016-07-27 4 views
1

私はQTアプリケーションapp.exeとQTプラグインplugin.dllを持っています。私のplugin.dllは他の多くのダイナミックライブラリ(例えば、lib1.dlllib2.dllなど)によって異なります。私は、このフォルダ構造(QTライブラリを無視して)を持っている私のプロジェクトを配布するには:独自のDLLを使用してQTプラグインをデプロイ

app.exe 
plugins\ 
    plugin.dll 
lib1.dll 
lib2.dll 
lib3.dll 

問題は、例えばそこlibX.dllにあまりにも多くの依存性があると私はプラグインフォルダにそれらを非表示にすることです:

app.exe 
plugin\ 
    plugin.dll 
    lib1.dll 
    lib2.dll 
    lib3.dll 

しかし、この方法ではライブラリlibX.dllは私のプラグインには見えないので、ロードすることはできません。この問題を解決する方法はありますか?

私はplugin.dllさんpro -fileでlibX.dllをインポートするには、このコードを使用しています。この問題を解決する方法の

LIBS += -Lpath -l lib1 -l lib2 -l lib3 

答えて

0

一つは次のとおりです。

  1. リンク動的にすべてのライブラリ(ランタイム時に)
  2. ライブラリを検索するための別の場所を追加します。

これらの変更はplugin.dllコードで実行する必要があります。

/* Declare a pointer to import function */ 

typedef void (*FUNCTION)(); 
FUNCTION f; 

/* Make system search the DLLs in my plugin folder */ 

// Variable "app" contains directory of the application, not the plugin 
QDir app = QDir(qApp->applicationDirPath()); 
// Combine path 
QString plugin_path = app.filePath("plugins/"); 
// Adding full path for DLL search 
SetDllDirectory(plugin_path.toStdWString().c_str()); 

/* Linking the library */ 

QLibrary mylib("mylib.dll"); 
f = (FUNCTION) mylib.resolve("function"); 
if (f != NULL) 
    f(); // You got the function from DLL 
else 
    return; // DLL could not be loaded 

このソリューションはdisadvangesがあります

  • それはプラットフォームに依存しない(私はあなたがUNIXライクなシステムでSetDllDirectoryの使用を避けることができると思うが、私はないあなたは多くの機能をインポートする場合は、ポインタの多くを持つことになります)
  • 確認

誰も純粋なQtソリューションを知っていますか?

関連する問題