2012-09-04 18 views
9

Tengo el muy simple CMakeLists.txtCMake en Linux: "plataforma de destino no admite la vinculación dinámica"

CMAKE_MINIMUM_REQUIRED(VERSION 2.8) 
FIND_PACKAGE(VTK REQUIRED) 
PROJECT(test CXX) 

que realmente no hace nada. El paquete VTK se encuentra correctamente en /usr/lib/vtk-5.8/VTKConfig.cmake. Este archivo incluye una serie de declaraciones del tipo

ADD_LIBRARY(foobar SHARED IMPORTED) 

para indicar que la biblioteca compartida libfoobar.so tendrá que ser vinculado en ejecutables.

Tras la creación de los Makefiles usando el guión anterior, sin embargo, CMake se quejará de que

CMake Warning (dev) at /usr/lib/vtk-5.8/VTKTargets.cmake:244 (ADD_LIBRARY): 
    ADD_LIBRARY called with SHARED option but the target platform does not 
    support dynamic linking. Building a STATIC library instead. This may lead 
    to problems. 
Call Stack (most recent call first): 
    /usr/lib/vtk-5.8/VTKConfig.cmake:200 (INCLUDE) 
    /usr/share/cmake-2.8/Modules/FindVTK.cmake:73 (FIND_PACKAGE) 
    CMakeLists.txt:4 (FIND_PACKAGE) 
This warning is for project developers. Use -Wno-dev to suppress it 

¿Qué significa esta advertencia y cómo se abordado?

Este es un sistema Linux con CMake 2.8.9. Si bien este mensaje de error aparece para todos los paquetes que contienen ADD_LIBRARY(foobar SHARED IMPORTED), VTK-5.8 se utiliza como ejemplo aquí.

Respuesta

7

Este mensaje de error se produce cuando la propiedad global CMake TARGET_SUPPORTS_SHARED_LIBS se establece falsa y utiliza una biblioteca compartida. Consulte Source/cmAddLibraryCommand.cxx línea 100 en la fuente CMake.

Esto normalmente no debería ocurrir a menos que esté compilando de forma cruzada para un sistema muy básico (SO incorporado).

Sospecho que este es un error en la última versión de CMake o que no ha configurado CMake correctamente.

+1

De hecho. Por alguna razón, 'TARGET_SUPPORTS_SHARED_LIBS' no está configurado aquí en esta máquina Linux. Establecer explícitamente 'SET_PROPERTY (PROPIEDAD GLOBAL TARGET_SUPPORTS_SHARED_LIBS TRUE)' elimina las advertencias. –

16

PROJECT establece algunas variables importantes sobre la plataforma.

No llame a los módulos FIND_ * antes de asignar un nombre a PROJECT.

+0

Excelente respuesta, sin embargo no aplica en caso de que el comando 'FIND_ *' esté en un archivo de cadena de herramientas. Ver https://cmake.org/Bug/view.php?id=15999 – Antonio

Cuestiones relacionadas