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_VERSION
este 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.txt
despué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 gcc
entonces tambien:
-
Pasar
-DCMAKE_C_COMPILER=
paracmake
al configurar el proyecto. De esa manera, CMake usará este compilador en lugar del predeterminado y en elproject()
llamarlo ajustará todas las banderas para el compilador especificado. -
Colocar
CC
Variable ambiental (CXX
para el compilador de C++). CMake comprueba esta variable cuando selecciona un compilador predeterminado. -
(Solo en casos excepcionales) Establecer
CMAKE_C_COMPILER
variable antes de losproject()
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 congcc
. - 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.