parametros ejecutar compilar compilador gcc cmake

ejecutar - parametros del compilador gcc



Cómo especificar una nueva ruta GCC para CMake (5)

Esta pregunta es bastante antigua, pero aún aparece en la Búsqueda de Google. La pregunta aceptada ya no me funcionaba y parece envejecer. La última información sobre cmake está escrita en las preguntas frecuentes de cmake .

Allí puede encontrar varias formas de cambiar la ruta de su compilador. Una forma sería

Establezca la (s) variable (s) CMAKE_FOO_COMPILER apropiadas en un nombre de compilador válido o una 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

en lugar de gcc-4.2 puedes escribir la ruta / a / tu / compilador como este

cmake -D CMAKE_C_COMPILER=/path/to/gcc/bin/gcc -D CMAKE_CXX_COMPILER=/path/to/gcc/bin/g++ .

Mi sistema operativo es centos que tiene un gcc predeterminado en la ruta /usr/bin/gcc . Pero es viejo, necesito una nueva versión de gcc. Entonces instalo una nueva versión en una nueva ruta /usr/local/bin/gcc .

Pero cuando ejecuto cmake , todavía usa la versión anterior gcc path ( /usr/bin/gcc ). ¿Cómo puedo especificar gcc a la nueva ruta ( /usr/local/bin/gcc ).

Intenté sobreescribir /usr/bin/gcc con /usr/local/bin/gcc , pero no funcionó.



La exportación debe ser específica sobre qué versión de GCC / G ++ usar, ya que si el usuario tiene una versión de compilación múltiple, no se compilará correctamente.

export CC=path_of_gcc/gcc-version export CXX=path_of_g++/g++-version cmake path_of_project_contain_CMakeList.txt make

En caso de que el proyecto use C ++ 11, esto se puede manejar utilizando el -std=C++-11 en CMakeList.txt


No sobrescriba CMAKE_C_COMPILER , pero exporte CC (y CXX ) antes de llamar a cmake:

export CC=/usr/local/bin/gcc export CXX=/usr/local/bin/g++ cmake /path/to/your/project make

La exportación solo debe hacerse una vez, la primera vez que configure el proyecto, luego esos valores se leerán en la memoria caché de CMake.

ACTUALIZACIÓN : explicación más larga sobre por qué no reemplaza CMAKE_C(XX)_COMPILER después del comentario de Jake

Recomiendo anular el valor CMAKE_C(XX)_COMPILER por dos razones principales: porque no funcionará bien con la memoria caché de CMake y porque rompe las comprobaciones del compilador y la detección de herramientas.

Cuando usa el comando set , tiene tres opciones:

  • sin caché, para crear una variable normal
  • con caché, para crear una variable en caché
  • forzar caché, forzar siempre el valor de caché al configurar

Veamos qué ocurre con las tres posibles llamadas para set :

Sin caché

set(CMAKE_C_COMPILER /usr/bin/clang) set(CMAKE_CXX_COMPILER /usr/bin/clang++)

Al hacer esto, crea una variable "normal" CMAKE_C(XX)_COMPILER que oculta la variable de caché del mismo nombre. Eso significa que su compilador ahora está codificado en su script de compilación y no puede darle un valor personalizado. Esto será un problema si tiene múltiples entornos de compilación con compiladores diferentes. Puedes actualizar tu script cada vez que quieras usar un compilador diferente, pero eso elimina el valor de usar CMake en primer lugar.

Ok, entonces, actualicemos el caché ...

Con caché

set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "") set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "")

Esta versión simplemente "no funcionará". La CMAKE_C(XX)_COMPILER ya está en la caché, por lo que no se actualizará a menos que la fuerce.

Ah ... usemos la fuerza, entonces ...

Forzar caché

set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "" FORCE) set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "" FORCE)

Esto es casi lo mismo que la versión variable "normal", la única diferencia es que su valor se establecerá en la memoria caché, para que los usuarios puedan verla. Pero cualquier cambio será sobrescrito por el comando set .

Rompiendo verificaciones y herramientas del compilador

Al principio del proceso de configuración, CMake realiza comprobaciones en el compilador: ¿Funciona? ¿Es capaz de producir ejecutables? etc. También usa el compilador para detectar herramientas relacionadas, como ar y ranlib . Cuando anula el valor del compilador en una secuencia de comandos, es "demasiado tarde", todas las comprobaciones y detecciones ya están hechas.

Por ejemplo, en mi máquina con gcc como compilador predeterminado, cuando se utiliza el comando set en /usr/bin/clang , ar se establece en /usr/bin/gcc-ar-7 . Cuando se utiliza una exportación antes de ejecutar CMake, se establece en /usr/lib/llvm-3.8/bin/llvm-ar .


Una solución alternativa es configurar su proyecto a través de cmake-gui, comenzando desde un directorio de construcción limpio. Entre las opciones que tienes disponibles al principio, existe la posibilidad de elegir la ruta exacta a los compiladores