Как указать новый путь GCC для CMake

Моя ОС - это centos, которая имеет gcc по умолчанию в пути /usr/bin/gcc, Но он старый, мне нужна новая версия GCC. Поэтому я устанавливаю новую версию по новому пути /usr/local/bin/gcc,

Но когда я бегу cmake, он все еще использует старую версию gcc path (/usr/bin/gcc) Как я могу указать GCC для нового пути (/usr/local/bin/gcc).

Я пытался переписать /usr/bin/gcc с /usr/local/bin/gcc, но это не работа.

8 ответов

Решение

Не перезаписывать CMAKE_C_COMPILER, но экспорт CC (а также CXX) перед вызовом cmake:

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

Экспорт необходимо выполнить только один раз, при первой настройке проекта эти значения будут считаны из кеша CMake.


ОБНОВЛЕНИЕ: более длинное объяснение, почему не переопределение CMAKE_C(XX)_COMPILER после комментария Джейка

Я рекомендую против переопределения CMAKE_C(XX)_COMPILER значение по двум основным причинам: потому что он не будет хорошо работать с кешем CMake и потому что он нарушает проверки компилятора и обнаружение инструментов.

При использовании set Команда, у вас есть три варианта:

  • без кеша, чтобы создать нормальную переменную
  • с кешем, чтобы создать кешированную переменную
  • принудительно кешировать, чтобы всегда принудительно устанавливать значение кеша при настройке

Давайте посмотрим, что происходит для трех возможных вызовов set:

Без кеша

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

При этом вы создаете "нормальную" переменную CMAKE_C(XX)_COMPILER который скрывает переменную кэша с тем же именем. Это означает, что ваш компилятор теперь жестко запрограммирован в вашем скрипте сборки, и вы не можете дать ему пользовательское значение. Это будет проблемой, если у вас несколько сред сборки с разными компиляторами. Вы можете просто обновлять ваш скрипт каждый раз, когда вы хотите использовать другой компилятор, но это в первую очередь удаляет значение использования CMake.

Хорошо, тогда давайте обновим кеш...

С кешем

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

Эта версия будет просто "не работать". CMAKE_C(XX)_COMPILER переменная уже находится в кеше, поэтому она не будет обновлена, пока вы ее не принудите.

Ах... давайте использовать силу, тогда...

Force кеш

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

Это почти то же самое, что и "нормальная" версия переменной, с той лишь разницей, что ваше значение будет установлено в кеше, чтобы пользователи могли его видеть. Но любое изменение будет перезаписано set команда.

Нарушение проверки компилятора и инструментов

В начале процесса настройки CMake выполняет проверки компилятора: работает ли он? Это в состоянии произвести исполняемые файлы? и т.д. Он также использует компилятор для обнаружения связанных инструментов, таких как ar а также ranlib, Когда вы переопределяете значение компилятора в скрипте, это "слишком поздно", все проверки и обнаружения уже сделаны.

Например, на моей машине с gcc в качестве компилятора по умолчанию, при использовании set командовать /usr/bin/clang, ar установлен в /usr/bin/gcc-ar-7, При использовании экспорта перед запуском CMake он устанавливается на /usr/lib/llvm-3.8/bin/llvm-ar,

Этот вопрос довольно старый, но все еще появляется в Поиске Google. Принятый вопрос больше не работал для меня и, кажется, состарился. Последняя информация о cmake написана в cmake FAQ.

Там вы можете найти различные способы изменить путь вашего компилятора. Один из способов был бы

Установите соответствующий CMAKE_FOO_COMPILER переменная (-и) к действительному имени компилятора или полному пути в командной строке, используя cmake -D, Например:

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

вместо gcc-4.2 вы можете написать путь к / вашему / вашему компилятору следующим образом

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

Задавать CMAKE_C_COMPILER на ваш новый путь.

Смотрите здесь: http://www.cmake.org/Wiki/CMake_Useful_Variables

+ Изменить CMAKE_<LANG>_COMPILER путь без запуска перенастройки

Я хотел скомпилировать с помощью альтернативного компилятора, но также передать параметры -D в командной строке, которые будут уничтожены, если установить другой компилятор. Это происходит потому, что запускается повторная настройка. Хитрость заключается в том, чтобы отключить обнаружение компилятора с помощьюNONE, установите пути с помощью FORCE, тогда enable_language.

project( sample_project NONE )

set( COMPILER_BIN /opt/compiler/bin )
set( CMAKE_C_COMPILER ${COMPILER_BIN}/clang CACHE PATH "clang" FORCE )
set( CMAKE_CXX_COMPILER ${COMPILER_BIN}/clang++ CACHE PATH "clang++" FORCE )

enable_language( C CXX )

Используйте файл Toolchain

Более разумный выбор - создать файл инструментальной цепочки.

set( CMAKE_SYSTEM_NAME Darwin )

set( COMPILER_BIN /opt/compiler/bin )
set( CMAKE_C_COMPILER ${COMPILER_BIN}/clang CACHE PATH "clang" )
set( CMAKE_CXX_COMPILER ${COMPILER_BIN}/clang++ CACHE PATH "clang++" )

Затем вы вызываете Cmake с дополнительным флагом

cmake -D CMAKE_TOOLCHAIN_FILE=/path/to/toolchain_file.cmake ...

Экспорт должен указывать, какую версию GCC/G++ использовать, потому что если бы у пользователя было несколько версий компилятора, он не скомпилировался бы успешно.

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

В случае использования проекта C++11 это можно сделать с помощью -std=C++-11 флаг в CMakeList.txt

Альтернативное решение - настроить ваш проект через cmake-gui, начиная с чистой директории сборки. Среди опций, которые у вас есть в начале, есть возможность выбрать точный путь к компиляторам.

Это работает не только с cmake, но и с ./configure а также make:

./configure CC=/usr/local/bin/gcc CXX=/usr/local/bin/g++

В результате:

checking for gcc... /usr/local/bin/gcc
checking whether the C compiler works... yes

RE Ответ Гийома:

Почему да, можно просто поменять местамиCMAKE_C_COMPILERиCMAKE_CXX_COMPILER, но вам нужно сделать это перед «инициализацией» проекта:

          set(CMAKE_C_COMPILER <path/to/c/compiler>)
    set(CMAKE_CXX_COMPILER <path/to/c++/compiler>)
    project(PROJECT_NAME)

CMake фактически выполняет эти проверки (в данном случае это не так, поскольку существование этих переменных указывает на то, что он уже обнаружил работающий компилятор, поэтому нет необходимости его проверять), когда вы выполняете «инициализацию» проекта, поэтому, если вы выполняете замену перед этим, он проверяет ваши недавно замененные переменные.

Хотя лучше поставитьCCиCXXпеременные среды:

          set(ENV{CC} <path/to/compiler>)
    set(ENV{CXX} <path/to/compiler>)
    project(PROJECT_NAME)

Таким образом, CMake также выполняет проверки компилятора.

Не уверен, что это «правильный» способ сделать это, но у меня работает («вычисление» нужного мне местоположения компилятора при запуске сценария CMake и замена для него места по умолчанию).

Другие вопросы по тегам