2012-12-01 3 views
8

Also, wenn Sie bereits ein binäres haben, können Sie eine rpath, um es auf OSX mit dem ‚install_name_tool‘, wie so hinzufügen:Wie fügen Sie einen rpath zu einer ausführbaren Datei in cmake auf Build (nicht installieren) auf OSX hinzu?

install_name_tool -add_rpath @executable_path/blah 

Xcode tut dies automatisch, wenn Sie ein Anwendungspaket Gebäude sind.

Ich weiß, dass in Cmake Sie dies die install_name der gemeinsam genutzten Bibliothek festlegen können:

set_target_properties(nshared PROPERTIES BUILD_WITH_INSTALL_RPATH 1 INSTALL_NAME_DIR "@rpath") 

Meine Frage ist, was ist das Äquivalent dies eine rpath in ein binäres hinzufügen?

(für das ‚Warum würden Sie das tun?‘ Unter euch, auf die gehen sehen otool -l auf eine der Anwendungen in Ihren Anwendungen/Ordner, und Sie werden viele Anwendungen mit Einträgen wie sehen:

.
Load command 15 
      cmd LC_RPATH 
     cmdsize 36 
     path @executable_path/../../Frameworks/ 

Diese gängige Praxis versuche ich es in cmake)

Antwort

10

nur tun können Sie ein POST_BUILD command verwenden, um einen LC_RPATH Ladebefehl zum integrierten ausführbaren hinzuzufügen:

add_custom_command(TARGET executable 
    POST_BUILD COMMAND 
    ${CMAKE_INSTALL_NAME_TOOL} -add_rpath "@executable_path/../../Frameworks/" 
    $<TARGET_FILE:executable>) 

Die Variable CMAKE_INSTALL_NAME_TOOL enthält den Pfad zur install_name_tool ausführbaren Datei unter Darwin.

+2

Nach meiner Erfahrung verursacht diese Lösung einen Fehler bei jedem Build nach dem ersten Build aus einem sauberen Verzeichnis. Der benutzerdefinierte Befehl POST_BUILD wird bei jedem Build ausgeführt, unabhängig davon, ob das Ziel veraltet ist oder nicht, und install_name_tool gibt einen Beendigungsstatus ungleich Null zurück und zeigt eine Meldung an, dass der hinzugefügte rpath-Wert bereits in der Zieldatei vorhanden ist (weil er hinzugefügt wurde) während des ersten Builds). CMake's Dokumentation scheint anzuzeigen, dass der POST_BUILD Befehl nur ausgeführt wird, wenn das Ziel veraltet ist, aber das scheint nicht der Fall zu sein. – mjl5007

+0

Diese Antwort funktioniert –

Verwandte Themen