2016-02-08 5 views
6

Ich habe ein Projekt-Setup mit ein paar Apps mit einer gemeinsamen Bibliothek, das ist alles gut mit einem SUBDIRS-Projekt, wo die Apps auf die gemeinsame Bibliothek angewiesen sind.Einstellung PATH/LD_LIBRARY_PATH für 'make check' mit QMake

TEMPLATE = subdirs 
SUBDIRS = app1 app2 sharedLib 
app1.depends = sharedLib 
app2.depends = sharedLib 

Jede App enthält auch eine Reihe von Tests mit CONFIG += testcase set.

Dadurch wird ein check Ziel erstellt, sodass wir alle Komponententests von der obersten Ebene .pro unter Verwendung von make check ausführen können.

Das Problem besteht darin, dass einige der App-Tests das Vorhandensein des Codes innerhalb der sharedLib erfordern, daher muss es nach den Suchregeln der einzelnen Plattformbibliotheken erkennbar sein.

Unter Windows ist eine Option, die sharedlib Standort auf dem PATH, auf Linux haben, können wir die sharedlib Standort LD_LIBRARY_PATH, auf dem Mac DYLD_LIBRARY_PATH hinzuzufügen.

Eine Lösung ist nur die Position des eingebauten gemeinsamen lib gesetzt, bevor make check ausgeführt wird:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:build/sharedDll/ 
make check 

und das funktioniert, aber es scheint ein wenig überflüssig, da es die Build-Skripte selbst ist, die das gemeinsame bauen Bibliothek, so dass sie den Pfad zum sharedlib Binärspeicherort kennen, die aus .pro/pri Dateien verwiesen werden kann:

$$TOP_BUILDDIR/sharedLib/release 

so gibt es ohnehin die PATH/LD_LIBRARY_PATH/DYLD_LIBRARY_PATH aus den Projektdateien für den Zweck eingestellt s des Befehls make check?

Antwort

0

Wenn Sie gcc verwenden, können Sie den Parameter rpath von gcc verwenden.

-rpath = dir
            ein Verzeichnis In den Runtime Bibliothekssuchpfad. Dies wird verwendet
            beim Verknüpfen einer ELF-Programmdatei mit gemeinsamen Objekten. Alle -rpath
            Argumente sind verkettete und zum Laufzeit Linker übergeben, die
            nutzt sie gemeinsam genutzte Objekte in Laufzeit zu finden.

QMAKE_CXXFLAGS + = -rpath =/das/absolute/path

Wenn Sie diese Technik verwenden, wird es nicht nötig sein, LD_LIBRARY_PATH

0

In Qt 5 zu bearbeiten.5, die folgende Qmake Anweisung prepends den Pfad $$TOP_BUILDDIR/sharedLib/release zu LD_LIBRARY_PATH für das Ziel check:

check.commands = LD_LIBRARY_PATH=$$TOP_BUILDDIR/sharedLib/release:\$$LD_LIBRARY_PATH $$check.commands 

ich Inspiration für diese Lösung aus den Dateien testcast.prf und qt_functions.prf (vor allem die Funktionen qtAddTargetEnv() und qtAddToolEnv()) zog, die sich beide in $$[QT_INSTALL_PREFIX]/mkspecs/features.