2015-07-22 7 views
11

Ich versuche eine CMake-basierte Software unter OS X (Yosemite) zu bauen, die unter Fedora 21 erfolgreich gebaut werden kann. Es benutzt eine Reihe von Bibliotheken. Beide, große offene wie Boost und einige selbstgeschriebene liegen in/installation_folder/lib. Ich benutze CMake Version 3.3.0.CMake Warnungen unter OS X: MACOSX_RPATH ist nicht für die folgenden Ziele angegeben

Nach

mkdir build 
cd build 
cmake .. -DCMAKE_C_COMPILER=/usr/local/Cellar/gcc/5.2.0/bin/gcc-5 -DCMAKE_CXX_COMPILER=/usr/local/Cellar/gcc/5.2.0/bin/g++-5 -DCMAKE_MODULE_PATH=${PWD}/../external/install/share/llvm/cmake 

Ausführung erhalte ich die folgenden Warnungen:

CMake Warning (dev): 
Policy CMP0042 is not set: MACOSX_RPATH is enabled by default. Run "cmake 
--help-policy CMP0042" for policy details. Use the cmake_policy command to 
set the policy and suppress this warning. 

MACOSX_RPATH is not specified for the following targets: 

ClangWrapper 
Structure 
WCETXML 

This warning is for project developers. Use -Wno-dev to suppress it. 

Die CMakeLists.txt enthält die folgenden Zeilen in Bezug auf RPATH:

SET(CMAKE_SKIP_BUILD_RPATH FALSE) 
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") 
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) 

LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir) 

IF("${isSystemDir}" STREQUAL "-1") 
    SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") 
ENDIF("${isSystemDir}" STREQUAL "-1") 

Alles, was ich sagen kann, ist, dass ${CMAKE_INSTALL_PREFIX}/lib ist in der Tat der richtige Pfad, und dass andere Bibliotheken wie Bo Ost sind richtig gefunden.

Das Ignorieren der Warnungen und Fortsetzen von "make" im Build-Verzeichnis führt zu einem Verknüpfungsfehler.

Ich las die CMake Wiki RPATH handling article, aber ich bin immer noch nicht in der Lage zwischen diesen Pfadvariablen und deren korrekte Anwendung auf OS X.

+0

Unsere CMakeLists.txt wurde während der Entwicklung nur unter Linux erstellt. Vielleicht verursacht eine andere Option die Warnung. Ich bin nicht sicher. – fotinsky

+0

Verwenden Sie keine RPATHs. Sie führen dazu, dass die resultierende Binärdatei eine Sicherheitsüberprüfung nicht besteht. Verwenden Sie stattdessen '-install_name' und' install_name_tool'. – jww

Antwort

12

Hinzufügen set(CMAKE_MACOSX_RPATH 1) in CMakeLists.txt, vor den oben genannten schriftlichen Erklärungen zu unterscheiden, können die Warnungen verschwinden . Das Verbindungsproblem nach der Ausführung von make bleibt bestehen. Dies bringt mich zu der Annahme, dass mein RPATH-Setup nichts mit meinem Verknüpfungsproblem zu tun hat.

Trotzdem ist das Problem dieses Threads gelöst. Eine Erklärung über die korrekte Verwendung der RPATH-Optionen in CMakeLists.txt ist immer noch sehr willkommen!

+4

Haben Sie das Verknüpfungsproblem jemals gelöst? Ich habe die gleichen Probleme –

+1

Ja, ich habe es gelöst. Die oben erwähnte RPATH-Variable hat nichts mit dem Verknüpfungsproblem zu tun. Es war notwendig, einige weitere Bibliotheken in der CMakeLists.txt hinzuzufügen, die CMake automatisch unter Linux finden konnte, aber nicht unter OS X. Update: Das Deaktivieren von (!) RPATH konnte, genau wie Hopia, das Problem auch beheben. Ich muss es ausprobieren. – fotinsky

+3

oder Sie können 'cmake_minimum_required (VERSION 3.0)' – neckTwi

3

Nun, ich gehe nur einen Schritt vorwärts von @ fotinskys Antwort. (Fühlen Sie sich frei, diese in Ihre Antwort zu integrieren.)

Der Ausgang der Vorschlag der Warnung cmake-Politik --help-Politik CMP0042 laufen soll:

CMake 2.8.12 and newer has support for using ``@rpath`` in a target's install 
name. This was enabled by setting the target property 
``MACOSX_RPATH``. The ``@rpath`` in an install name is a more 
flexible and powerful mechanism than ``@executable_path`` or ``@loader_path`` 
for locating shared libraries. 

CMake 3.0 and later prefer this property to be ON by default. Projects 
wanting ``@rpath`` in a target's install name may remove any setting of 
the ``INSTALL_NAME_DIR`` and ``CMAKE_INSTALL_NAME_DIR`` 
variables. 

This policy was introduced in CMake version 3.0. CMake version 
3.1.3 warns when the policy is not set and uses OLD behavior. Use 
the cmake_policy command to set it to OLD or NEW explicitly. 

Dies bedeutet einfach, dass in späteren Versionen cmake, Der Benutzer muss CMAKE_MACOSX_RPATH explizit aktivieren oder deaktivieren.

Es gibt auch mehr Hintergrundinformationen über die Einführung dieser Variablen in diesem CMake blog entry.

+0

Sehr interessant einstellen. CMAKE_INSTALL_NAME_DIR wird tatsächlich in unserer CMakeLists.txt verwendet. Wenn Sie RPATH nicht festlegen oder RPATH aktivieren, werden die INSTALL_NAME-Variablen möglicherweise ignoriert. Ich werde versuchen RPATH explizit zu deaktivieren. – fotinsky