使用自己的DLL依赖部署QT插件

时间:2016-07-27 11:13:17

标签: qt plugins deployment

我有一个QT应用app.exe和一个QT插件plugin.dll。我的plugin.dll取决于许多其他动态库(例如lib1.dlllib2.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是"看不见的"到我的插件,以便它无法加载。有没有办法解决这个问题?

我正在使用此代码导入libX.dll plugin.dll pro中的LIBS += -Lpath -l lib1 -l lib2 -l lib3 - 文件:

java.fullversion=JRE 1.6.0 IBM J9 2.6 Windows 7 amd64-64 Compressed References 20151222_283040 (JIT enabled, AOT enabled)

1 个答案:

答案 0 :(得分:0)

解决此问题的方法之一是:

  1. 动态链接所有库(在运行时)
  2. 添加额外位置以搜索库
  3. 这些更改应在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
    

    此解决方案存在缺陷:

    • 它不是独立于平台的(我认为你可以避免在类UNIX系统中使用SetDllDirectory,但我不确定)
    • 如果您导入了很多功能,那么您将有很多指针

    有人知道纯Qt解决方案吗?