Pregunta:
Advertencia Arduino CMakeLists "La política CMP0022 no está configurada: INTERFACE_LINK_LIBRARIES"
fenix688
2014-03-25 17:24:10 UTC
view on stackexchange narkive permalink

Estoy tratando de crear un ejemplo de Arduino sin usar su IDE. Mi sistema operativo es Windows 8.1 y estoy usando la última versión de CMake (2.8.12.2) y MinGW (GNU Make 3.82.90) .

Descargué Arduino CMakeLists y aprendí todo sobre hacer / cargar cualquier firmware en mi Arduino. Estoy usando Arduino UNO .

Entonces, si modifico las CMakeLists guardadas en ~ / arduino-cmake-master / example / CMakeLists.txt ( arduino-cmake-master es la carpeta del repositorio) para construir el ejemplo de WiFi WiFiWebClient también:

  ... # Agrega el ejemplo de WiFi -> WiFiWebClientgenerate_arduino_example (wifi_example LIBRARY WiFi EXAMPLE WiFiWebClient) ...  

Y ejecuta:

  $ cmake -G "MinGW Makefiles" ... CMake Advertencia (dev) en example / CMakeLists.txt: La política CMP0022 no está establecida: INTERFACE_LINK_LIBRARIES define la interfaz de enlace. Ejecute "cmake --help-policy CMP0022" para obtener detalles sobre la política. Utilice el comando cmake_policy para establecer la política y suprimir esta advertencia. El destino "uno_example" tiene una propiedad INTERFACE_LINK_LIBRARIES. Esto debería preferirse como fuente de la interfaz de enlace para esta biblioteca, pero debido a que CMP0022 no está configurado, CMake ignora la propiedad y utiliza la implementación del enlace como interfaz de enlace. INTERFACE_LINK_LIBRARIES: uno_CORE; uno_example; uno_Wire Implementación del enlace: uno_CORE; uno_Wire Esta advertencia es para desarrolladores de proyectos. Utilice -Wno-dev para suprimirlo. Haga una advertencia (dev) en example / CMakeLists.txt: La política CMP0022 no está establecida: INTERFACE_LINK_LIBRARIES define la interfaz de enlace. Ejecute "cmake --help-policy CMP0022" para obtener detalles sobre la política. Utilice el comando cmake_policy para establecer la política y suprimir esta advertencia. El destino "uno_Wire" tiene una propiedad INTERFACE_LINK_LIBRARIES. Esto debería ser
preferido como el origen de la interfaz de enlace para esta biblioteca, pero debido a que CMP0022 no está configurado, CMake ignora la propiedad y utiliza la implementación del enlace como interfaz de enlace. INTERFACE_LINK_LIBRARIES: uno_CORE; uno_Wire Link Implementación: uno_CORE Esta advertencia es para los desarrolladores de proyectos. Utilice -Wno-dev para suprimirlo. Haga una advertencia (dev) en example / CMakeLists.txt: La política CMP0022 no está establecida: INTERFACE_LINK_LIBRARIES define la interfaz de enlace. Ejecute "cmake --help-policy CMP0022" para obtener detalles sobre la política. Utilice el comando cmake_policy para establecer la política y suprimir esta advertencia. El destino "uno_SPI" tiene una propiedad INTERFACE_LINK_LIBRARIES. Esto debería preferirse como fuente de la interfaz de enlace para esta biblioteca, pero debido a que CMP0022 no está configurado, CMake ignora la propiedad y utiliza la implementación de enlace como interfaz de enlace. INTERFACE_LINK_LIBRARIES: uno_CORE; uno_SPI Implementación del enlace: uno_CORE Esta advertencia es para los desarrolladores de proyectos. Utilice -Wno-dev para suprimirlo. Haga una advertencia (dev) en example / CMakeLists.txt: La política CMP0022 no está establecida: INTERFACE_LINK_LIBRARIES define la interfaz de enlace. Ejecute "cmake --help-policy CMP0022" para obtener detalles sobre la política. Utilice el comando cmake_policy para establecer la política y suprimir esta advertencia. El objetivo "uno_WiFi" tiene una propiedad INTERFACE_LINK_LIBRARIES. Esto debería preferirse como fuente de la interfaz de enlace para esta biblioteca, pero debido a que CMP0022 no está configurado, CMake ignora la propiedad y utiliza la implementación de enlace como interfaz de enlace. INTERFACE_LINK_LIBRARIES: uno_CORE; uno_WiFi Link Implementación: uno_CORE Esta advertencia es para desarrolladores de proyectos. Use -Wno-dev para suprimirlo .-- Generando hecho-- Los archivos de compilación se han escrito en: ~ / arduino-cmake-master  

Luego ejecuto:

  $ mingw32-make ... Vinculando la biblioteca estática CXX libuno_WiFi.a [89%] Construyó el objetivo uno_WiFiScanning dependencias del objetivo wifi_example
[92%] Ejemplo de objeto de construcción CXX / CMakeFiles / wifi_example.dir / wifi_example_WiFiWebClient.cpp.objLink CXX ejecutable wifi_example.elflibuno_WiFi.a (WiFiClient.cpp.obj): En función `WiFiClient :: status () ': C: \ Programa Archivos \ Arduino \ libraries \ WiFi / WiFiClient.cpp: 160: referencia indefinida a `ServerDrv :: getClientState (unsigned char) 'libuno_WiFi.a (WiFiClient.cpp.obj): En función` WiFiClient :: stop ()': C : \ Archivos de programa \ Arduino \ libraries \ WiFi / WiFiClient.cpp: 131: referencia indefinida a `ServerDrv :: stopClient (unsigned char) 'libuno_WiFi.a (WiFiClient.cpp.obj): En función` WiFiClient :: peek () ': C: \ Archivos de programa \ Arduino \ libraries \ WiFi / WiFiClient.cpp: 117: referencia indefinida a `ServerDrv :: getData (unsigned char, unsigned char *, unsigned char)' libuno_WiFi.a (WiFiClient.cpp.obj) : En la función `WiFiClient :: read () ': C: \ Archivos de programa \ Arduino \ libraries \ WiFi / WiFiClient.cpp: 101: referencia indefinida a` ServerDrv :: getData (unsigned char, unsigned char *, unsigned char)' libuno_WiFi.a (WiFiClient.cpp.obj): En función `WiFiClient :: read (unsigned char *, unsigned int) ': C: \ Archivos de programa \ Arduino \ libraries \ WiFi / WiFiClient.cpp: 107: referencia no definida a` ServerDrv :: getDataBuf (unsigned char, unsigned char *, unsigned int *) 'libuno_WiFi.a (WiFiClient.cpp.obj): En la función `WiFiClient :: available ()': C: \ Program Files \ Arduino \ libraries \ WiFi / WiFiClient.cpp: 90: referencia indefinida a` ServerDrv: : availData (unsigned char) 'libuno_WiFi.a (WiFiClient.cpp.obj): En la función `WiFiClient :: write (unsigned char const *, unsigned int)': C: \ Program Files \ Arduino \ libraries \ WiFi / WiFiClient. cpp: 73: referencia indefinida a `ServerDrv :: sendData (unsigned char, unsigned char const *, unsigned int) 'C: \ Program Files \ Arduino \ libraries \ WiFi / WiFiClient.cpp: 78: referencia indefinida a` ServerDrv :: checkDataSent (carácter sin firmar) 'libuno_WiFi.a (WiFiClient.cpp.obj): En la función `WiFiClient :: connect (IPAddress, unsigned int)':
C: \ Program Files \ Arduino \ libraries \ WiFi / WiFiClient.cpp: 36: referencia indefinida a `ServerDrv :: startClient (unsigned long, unsigned int, unsigned char, unsigned char) 'libuno_WiFi.a (WiFi.cpp.obj) : En la función `WiFiClass :: hostByName (char const *, IPAddress&) ': C: \ Archivos de programa \ Arduino \ libraries \ WiFi / WiFi.cpp: 228: referencia indefinida a` WiFiDrv :: getHostByName (char const *, IPAddress&) 'libuno_WiFi.a (WiFi.cpp.obj): En la función `WiFiClass :: status ()': C: \ Archivos de programa \ Arduino \ libraries \ WiFi / WiFi.cpp: 223: referencia no definida a` WiFiDrv :: getConnectionStatus ( ) 'libuno_WiFi.a (WiFi.cpp.obj): En la función `WiFiClass :: RSSI ()': C: \ Archivos de programa \ Arduino \ libraries \ WiFi / WiFi.cpp: 181: referencia no definida a` WiFiDrv :: getCurrentRSSI () 'libuno_WiFi.a (WiFi.cpp.obj): En la función `WiFiClass :: SSID ()': C: \ Archivos de programa \ Arduino \ libraries \ WiFi / WiFi.cpp: 169: referencia no definida a` WiFiDrv :: getCurrentSSID () 'libuno_WiFi.a (WiFi.cpp.obj): En función `WiFiClass :: localIP ()': C: \ Archivos de programa \ Arduino \ libr aries \ WiFi / WiFi.cpp: 149: referencia indefinida a `WiFiDrv :: getIpAddress (IPAddress&) 'libuno_WiFi.a (WiFi.cpp.obj): En función` WiFiClass :: begin (char *, char const *)': C: \ Archivos de programa \ Arduino \ libraries \ WiFi / WiFi.cpp: 87: referencia indefinida a `WiFiDrv :: wifiSetPassphrase (char *, unsigned char, char const *, unsigned char) 'C: \ Program Files \ Arduino \ libraries \ WiFi / WiFi.cpp: 92: referencia indefinida a `WiFiDrv :: getConnectionStatus () 'libuno_WiFi.a (WiFi.cpp.obj): En función` WiFiClass :: init ()': C: \ Archivos de programa \ Arduino \ libraries \ WiFi / WiFi.cpp: 22: referencia no definida a `WiFiDrv :: wifiDriverInit () 'example \ CMakeFiles \ wifi_example.dir \ build.make: 95: receta para el objetivo' example / wifi_example.elf 'failedmingw32-make [2 ]: *** [ejemplo / wifi_example.elf] Error 1CMakeFiles \ Makefile2: 748: receta para el objetivo 'ejemplo / CMakeFiles / wifi_example.dir / all' failedmingw32-make [1]: *** [ejemplo / CMakeFiles / wifi_example. dir / all] Error 2Makefile: 74: la receta para el objetivo 'todos' falló w32-make: *** [todos] Error 2

El problema es Arduino.cmake porque no se vincula correctamente con la biblioteca WiFi, pero se vincula con la biblioteca Wire.

Cualquiera sabe por qué aparece esa advertencia y ¿Por qué los enlaces Wire están bien pero WiFi no?

¡Gracias!

Nota : Estoy usando el código original que está en el ejemplo del repositorio, I no he modificado este.

¿Puede confirmar que podría generar los ejemplos ANTES de modificar `CMakeLists.txt`? Además, ¿modificó algo más en este archivo?
La advertencia dada por cmake no parece ser un problema (recibí la misma advertencia para uno de mis proyectos de ejemplo y luego funciona bien). ¿Ha intentado usar otro generador (estoy usando "Unix Makefiles" y funciona bien para mi proyecto; solo tuve que instalar una versión de Windows de `make`).
Otro punto: ¿probaste `generate_arduino_library (WiFi ...)` primero, definiendo todos los encabezados y archivos fuente incluidos en el directorio WiFi? De hecho, no creo que cmake pueda construir la biblioteca correctamente, ya que no debería poder encontrar archivos en el subdirectorio `utility`: estos son los archivos que contienen definiciones de las que se queja` mingw32-make`.
Relacionado con mi comentario anterior, una opción más rápida que podría probar es `set (WiFi_RECURSE True)`; le dice a cmake que compile todos los archivos, incluidos los de los subdirectorios de la biblioteca WiFi.
One responder:
jfpoilpret
2014-03-26 11:31:05 UTC
view on stackexchange narkive permalink

Su pregunta en realidad tiene 2 partes distintas:

  1. ¿Por qué arduino-cmake genera la advertencia "La política CMP0022 no está configurada: INTERFACE_LINK_LIBRARIES ..."?
  2. ¿Por qué ¿ make , usando el MakeFile generado, falla al construir un ejemplo de WiFi?

Primero que nada , el arduino-cmake " Policy CMP0022 "es solo una advertencia, no un error. Según este artículo de cmake, esa política de CMP se ha introducido recientemente en CMake 2.8.12 .

Recibe esta advertencia simplemente porque arduino-cmake se ha creado en base a una versión anterior de cmake y por lo tanto no es compatible específicamente con esta nueva política.

Para eliminar esta advertencia, la documentación menciona que debe agregar el cmake_policy (SET CMP0022 OLD) comando a su configuración de cmake.

Desafortunadamente, lo intenté en el ejemplo CMakeLists.txt sin éxito; tal vez tenga que configurarse directamente en archivos arduino-cmake (que no he probado).

Por lo tanto, si desea deshacerse de esta aburrida advertencia, parece que la única solución que le queda es para deshabilitar todas las advertencias al iniciar cmake:

cmake -G "MinGW Makefiles" -Wno-dev

Esto funciona bien y ha eliminado todas las advertencias ..

Tu segundo problema (el real diría yo) se debe a la estructura de la biblioteca WiFi: enter image description here

De hecho, como puedes ver más arriba, tiene un subdirectorio utility que contiene código fuente adicional que no puede ser encontrado por arduino-cmake , ya que de forma predeterminada busca archivos de código fuente solo en el directorio de primer nivel .

¿Cómo solucionarlo? Solo dile a arduino-cmake que haga una búsqueda recursiva de la biblioteca WiFi ; en su CMakeLists.txt , asegúrese de agregar la siguiente línea:

  set (WiFi_RECURSE True) generate_arduino_example (wifi_example LIBRARY WiFi EXAMPLE WiFiWebClient)  

La línea añadida set (WiFi_RECURSE True) simplemente le dice a arduino-cmake que, para la biblioteca WiFi, debería recurrir a través de subdirectorios al buscar el código fuente.

He comprobado con "Makefiles Unix" (no "Makefiles MinGW" pero supongo que eso no hará ninguna diferencia) y funcionó bien.



Esta pregunta y respuesta fue traducida automáticamente del idioma inglés.El contenido original está disponible en stackexchange, a quien agradecemos la licencia cc by-sa 3.0 bajo la que se distribuye.
Loading...