2015-07-22 16 views
11

Provo a creare un software basato su CMake in OS X (Yosemite) che può essere compilato correttamente con Fedora 21. Utilizza un mucchio di librerie. Entrambi, quelli grandi aperti come Boost e alcuni scritti da soli che si trovano in/installation_folder/lib. Io uso CMake versione 3.3.0.Avvisi CMake in OS X: MACOSX_RPATH non specificato per i seguenti target

Dopo l'esecuzione

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 

ottengo le seguenti avvertenze:

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. 

Il CMakeLists.txt contiene le seguenti righe riguardanti 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") 

Tutto quello che posso dire è che ${CMAKE_INSTALL_PREFIX}/lib è davvero il percorso corretto, e che altre biblioteche come Bo ost si trovano correttamente.

Ignorare gli avvisi e continuare con "make" nella directory di compilazione genera un errore di collegamento.

ho letto il CMake Wiki RPATH handling article, ma non sono ancora in grado di distinguere tra queste variabili di percorso e il loro corretto utilizzo su OS X.

+0

Il nostro CMakeLists.txt è stato creato durante lo sviluppo solo su Linux. Forse un'altra opzione provoca l'avviso. Non sono sicuro. – fotinsky

+0

Non usare RPATH. Faranno sì che il binario risultante fallisca un controllo di sicurezza. Invece, usa '-install_name' e' install_name_tool'. – jww

risposta

12

Aggiunta set(CMAKE_MACOSX_RPATH 1) in CMakeLists.txt, prima che le dichiarazioni di cui sopra scritte, lascia gli avvertimenti scompaiono . Il problema di collegamento dopo l'esecuzione di make rimane. Questo mi porta a supporre che la mia configurazione di RPATH non abbia nulla a che fare con il mio problema di collegamento.

Tuttavia, questo problema è risolto. Una spiegazione sull'uso corretto delle opzioni RPATH all'interno di CMakeLists.txt è ancora benvenuta!

+4

Hai mai risolto il problema di collegamento? Sto avendo lo stesso problema –

+1

Sì, l'ho risolto. La variabile RPATH sopra menzionata non ha nulla a che fare con il problema di collegamento. Era necessario aggiungere altre librerie nel CMakeLists.txt che CMake poteva trovare automaticamente sotto Linux, ma non sotto OS X. Aggiornamento: Disabilitare (!) RPATH esplicitamente, come detto da hopia, poteva anche risolvere il problema. Devo provarlo. – fotinsky

+3

oppure puoi impostare 'cmake_minimum_required (VERSION 3.0)' – neckTwi

3

Bene, farò un passo avanti dalla risposta di @ fotinsky. (Sentitevi liberi di integrare questo nella vostra risposta.)

L'uscita del suggerimento del warning per eseguire cmake-politica --help-politica CMP0042 è:

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. 

Questo significa semplicemente che nelle versioni successive cmake, l'utente è tenuto ad abilitare o disabilitare esplicitamente CMAKE_MACOSX_RPATH.

Ci sono anche altre informazioni di base sull'introduzione di questa variabile in questo CMake blog entry.

+0

Molto interessante. CMAKE_INSTALL_NAME_DIR è effettivamente utilizzato nel nostro CMakeLists.txt. Non impostando RPATH o abilitando RPATH, le variabili INSTALL_NAME possono essere ignorate. Proverò a disabilitare esplicitamente RPATH. – fotinsky