2016-03-03 5 views
6

Was ich tun möchte, ist meine CMakeLists-Datei zu konfigurieren, so dass beim Erstellen meines Projekts der Linker eine Kopie einer freigegebenen Bibliothek (.so) verwendet in meinem Build-Baum, um die ausführbare Datei mit zu verknüpfen, setzt aber den rpath in der verknüpften ausführbaren Datei nicht, so dass das System die Bibliothek bereitstellen muss, wenn der Loader dies anfordert.CMake: Legen Sie nicht rpath für eine einzelne Bibliothek in Verbindung verwendet

Insbesondere möchte ich während der Build-Zeit auf einer Build-Farm, die libOpenCL.so nicht als Systembibliothek installiert hat, mit libOpenCL.so verknüpfen. Dazu befindet sich libOpenCL.so in der Projektbaumstruktur und wird mit einem absoluten Pfad in der CMakeLists-Datei referenziert. Dieser absolute Pfad soll sicherstellen, dass, falls das System libOpenCL.so installiert hat, es nicht verwendet wird.

Wenn jedoch die endgültige ausführbare Datei ausgeführt wird, hat CMake den absoluten Pfad zum rpath hinzugefügt, der die Systemversion von libOpenCL.so stoppt, die vom Bibliotheksladeprogramm abgerufen und verwendet wird.

Scheint einfach, aber ich kann es nicht ganz herausfinden.

Danke!

+2

Sie können die RPATH-Einstellungen vollständig steuern, statt CMake automatisch generieren zu lassen. Siehe Wiki über [Übergabe von RPATH in CMake] (https://cmake.org/Wiki/CMake_RPATH_handling). – Tsyvarev

Antwort

0

Nach dem CMake Wiki sollte dies kein Problem sein:

standardmäßig, wenn Sie irgendwelche RPATH bezogenen Einstellungen nicht ändern, CMake werden die ausführbaren Dateien und gemeinsam genutzte Bibliotheken mit voller RPATH auf alle verwendeten Bibliotheken verknüpfen in der Build-Baum. Bei der Installation wird der RPATH dieser Ziele gelöscht, sodass sie mit einem leeren RPATH installiert werden.

Sie könnten also versuchen, es einfach zu installieren?

+0

Ich möchte den Build-Struktur-Rpath und nicht den Installations-Rpath ändern. Darüber hinaus sind einige der Bibliotheken, die ich verwende, benutzerdefinierte Bibliotheken, die nach der Installation einen rpath enthalten sollten. Die richtige Mischung, um den rpath für einige Bibliotheken zu behalten und für andere zu verwerfen, ist der Kern meines Problems. Im Idealfall, pro Bibliothek rpath Konfiguration, aber ich kann nicht finden, dass in cmake :( – user2746401

+0

@ user2746401 Also sind eine Kompilierung "in Ort" ohne Installation von Verschieben der endgültigen Binärdateien woanders? Selbst wenn Sie den rpath von all Ihren Binärdateien entfernen würde, die "temporäre" OpenCL-Bibliothek wäre immer noch die beste Lösung für den Linker, oder? – ToniBig

+0

@ToniBig Ich baue an Ort und Stelle.Wenn ich den rpath strip die Bibliothek Loader wird nicht in der Lage, meine benutzerdefinierten Bibliotheken überhaupt zu finden Daher würde der Loader die "temporäre" OpenCL-Bibliothek nicht finden. Beachten Sie, dass dies eine Bibliothekslader-Frage und keine Linker-Konfigurationsfrage ist. – user2746401