Saltar al contenido

¿Cómo especificar un compilador en CMake?

Nuestros investigadores estrellas han agotado sus depósitos de café, en su búsqueda diariamente por la resolución, hasta que Sofía halló la contestación en Beanstalk por lo tanto hoy la compartimos contigo.

Solución:

Para seleccionar un compilador específico, tiene varias soluciones, como se explica en la wiki de CMake:

Método 1: usar variables de entorno

Para C y C++, configure el CC y CXX Variables de entorno. No se garantiza que este método funcione para todos los generadores. (Específicamente, si está tratando de configurar Xcode GCC_VERSIONeste método confunde a Xcode). Por ejemplo:

CC=gcc-4.2 CXX=/usr/bin/g++-4.2 cmake -G "Your Generator" path/to/your/source

Método 2: usa cmake -D

Establezca el apropiado CMAKE_FOO_COMPILER variable (s) a un nombre de compilador válido o ruta completa en la línea de comando usando cmake -D. Por ejemplo:

cmake -G "Your Generator" -D CMAKE_C_COMPILER=gcc-4.2 -D CMAKE_CXX_COMPILER=g++-4.2 path/to/your/source

Método 3 (evitar): usar set()

Establezca el apropiado CMAKE_FOO_COMPILER variable(s) a un nombre de compilador válido o ruta completa en un archivo de lista usando set(). Esto debe hacerse antes de configurar cualquier idioma (es decir: antes de project() o enable_language() mando). Por ejemplo:

set(CMAKE_C_COMPILER "gcc-4.2")
set(CMAKE_CXX_COMPILER "/usr/bin/g++-4.2")

project("YourProjectName")

La wiki no proporciona una razón por la cual se debe evitar el tercer método …

Veo más y más personas que establecen CMAKE_C_COMPILER y otras variables relacionadas con el compilador en el CMakeLists.txtdespués los project llamar y preguntarse por qué este enfoque se rompe a veces.

lo que sucede en realidad

Cuando CMake ejecuta el project() llama, busca un ejecutable del compilador predeterminado y determina la forma de usarlo: indicadores predeterminados del compilador, indicadores predeterminados del enlazador, funciones de compilación, etc.

Y CMake almacena la ruta a ese ejecutable del compilador predeterminado en el CMAKE_C_COMPILER variable.

cuando uno se pone CMAKE_C_COMPILER variable después los project() llama esto solamente cambia el ejecutable del compilador: banderas predeterminadas, todas las características permanecen configuradas para el compilador predeterminado.

COMO RESULTADO: Cuando se compila el proyecto, un sistema de compilación llama al especificado por el proyecto compilador ejecutable pero con parámetros adecuado para el compilador predeterminado.

Como uno podría adivinar, este enfoque funcionaría solo cuando uno reemplaza un compilador predeterminado con un altamente compatible una. ej., reemplazo de gcc con clang podría funcionar a veces.

Este enfoque Nunca funciona para reemplazo de cl compilador (usado en Visual Studio) con gcc una. Tampoco esto funcionará al reemplazar un nativo compilador con un cruzar-compilador.

Qué hacer

Nunca establecer un compilador en CMakeLists.txt.

Si desea, por ejemplo, utilizar clang en lugar de predeterminado gccentonces tambien:

  1. Pasar -DCMAKE_C_COMPILER= para cmake al configurar el proyecto. De esa manera, CMake usará este compilador en lugar del predeterminado y en el project() llamarlo ajustará todas las banderas para el compilador especificado.

  2. Colocar CC Variable ambiental (CXX para el compilador de C++). CMake comprueba esta variable cuando selecciona un compilador predeterminado.

  3. (Solo en casos excepcionales) Establecer CMAKE_C_COMPILER variable antes de los project() llamada. Este enfoque es similar al primero, pero hace que el proyecto sea menos flexible.

Si las formas anteriores no funcionan

Si en la configuración CMAKE_C_COMPILER en la línea de comando CMake errores de que un compilador no puede “compilar un proyecto simple”, entonces algo anda mal en su entorno… o usted especifica un compilador incompatible para el generador o plataforma elegidos.

Ejemplos:

  • Los generadores de Visual Studio funcionan con cl compilador pero no puede trabajar con gcc.
  • Un compilador MinGW generalmente requiere un generador de Makefiles MinGW.

Generador incompatible no poder ser fijado en CMakeLists.txt. Uno necesita pasar el adecuado -G opción a la cmake ejecutable (o seleccione el generador adecuado en CMake GUI).

Compilación cruzada

La compilación cruzada generalmente requiere configurar la variable CMAKE_SYSTEM_NAME, y esta configuración normalmente se debe realizar en el archivo de la cadena de herramientas. Que archivo de cadena de herramientas también se encarga de configurar un compilador.

Ajuste CMAKE_SYSTEM_NAME en el CMakeLists.txt es casi siempre un error.

Debe crear un archivo de cadena de herramientas y usar el módulo CmakeForceCompiler.

Aquí hay un archivo de cadena de herramientas de ejemplo para el desarrollo de ARM sin sistema operativo con IAR:

include(CMakeForceCompiler)

set(CMAKE_SYSTEM_NAME Generic) # Or name of your OS if you have one
set(CMAKE_SYSTEM_PROCESSOR arm) # Or whatever
set(CMAKE_CROSSCOMPILING 1)

set(CMAKE_C_COMPILER iccarm) # Change the arm suffix if appropriate
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) # Required to make the previous line work for a target that requires a custom linker file

La última línea es necesaria porque CMake intentará compilar un programa de prueba con el compilador para asegurarse de que funciona y obtener información de la versión de las definiciones del preprocesador. Sin esta línea, CMake usará add_executable() para el programa de prueba y obtendrá el error “El compilador de C “XXX” no puede compilar un programa de prueba simple”. Esto se debe a que el programa de prueba no se vincula, ya que no tiene su archivo de vinculación personalizado (supongo que es un desarrollo básico, ya que para esto se suele usar IAR). Esta línea le dice a CMake que use add_library() en su lugar, lo que hace que la prueba sea exitosa sin el archivo del enlazador. Fuente de esta solución alternativa: esta publicación de la lista de correo de CMake.

Luego, asumiendo que su archivo de cadena de herramientas se llama iar-toolchain.cmake, invoque CMake de esta manera:

cmake -DCMAKE_TOOLCHAIN_FILE=iar-toolchain.cmake .

Te mostramos las reseñas y valoraciones de los lectores

Si aceptas, eres capaz de dejar una noticia acerca de qué le añadirías a esta crónica.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *