2016-07-27 4 views
1

Ich habe eine QT-Anwendung und ein QT-Plugin plugin.dll. Mein plugin.dll hängt von vielen anderen dynamischen Bibliotheken ab (z. B. lib1.dll, lib2.dll und so weiter). So verteilen Sie mein Projekt, das ich diese Ordnerstruktur (ohne Berücksichtigung von QT-Bibliotheken):Bereitstellen von QT-Plugin mit seinen eigenen DLL-Funktionen

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

Das Problem ist, dass es zu viele Abhängigkeiten auf libX.dll und ich möchte, dass sie in einem Plugin-Ordner verbergen, zum Beispiel:

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

Aber so sind die Bibliotheken libX.dll "ungesehen" zu meinem Plugin, so dass es nicht geladen werden kann. Gibt es eine Möglichkeit, dieses Problem zu lösen?

ich diesen Code verwenden libX.dll in plugin.dll ‚s pro -Dateien zu importieren:

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

Antwort

0

Einer der Möglichkeiten, dieses Problem zu lösen ist:

  1. Verknüpfen Sie alle Bibliotheken dynamisch (zur Laufzeit)
  2. Einen zusätzlichen Ort hinzufügen, um nach den Bibliotheken zu suchen
/* 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 

Diese Lösung hat Nachteile bei:

  • Es ist nicht plattformunabhängig (ich glaube, können Sie vermeiden, indem SetDllDirectory in UNIX-ähnlichen Systemen, aber ich bin

    Diese Änderungen sollten in plugin.dll Code erfolgen nicht sicher)

  • Wenn Sie eine Menge von Funktionen importieren Sie eine Menge von Zeigern
haben 10 Kennt jemand eine reine Qt-Lösung?