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

122

Моя ОС - это 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, но она не работает.

аккуратный
источник
2
Я думаю, что лучше установить альтернативную версию gcc, /optа не в /usr/local. Желательно /opt/gcc-x.y.z. Таким образом, если вам понадобится еще более новая версия, у вас не возникнет проблем с удалением предыдущей.
user666412

Ответы:

220

Не перезаписывать CMAKE_C_COMPILER, а экспортировать CCCXX) перед вызовом 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Переменная уже в кэше, поэтому он не будет обновляться , если не заставить его.

А ... давай применим силу, тогда ...

Принудительный кеш

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.

Гийом
источник
Эквивалент для ленивых, если в вашем $ PATH заданы соответствующие компиляторы:> export CC = which gcc > export CXX =which g++
gerardw
11
Эквивалент для ленивых, если в вашем $ PATH установлены правильные компиляторы: export CC=`which gcc` export CXX=`which g++`
gerardw
Если CC / CXX отличается от пути, я получаюIncorrect 'gcc' version 'compiler.version=5.3' is not the one detected by CMake: 'GNU=4.8'
Lilith River
1
Как мне это сделать, если я использую Windows?
mr5 02
5
На самом деле, настройки CMAKE_C_COMPILERхорошо работает при условии , вы делаете это с помощью командной строки: $ cmake -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ /path/to/source.
Эрван Легран,
25

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

Есть разные способы изменить путь к вашему компилятору. Один из способов был бы

Задайте для соответствующей 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вы можете написать вот path/to/your/compilerтак

 cmake -D CMAKE_C_COMPILER=/path/to/gcc/bin/gcc -D CMAKE_CXX_COMPILER=/path/to/gcc/bin/g++ .
лямбда
источник
2
Я делал это при сборке старого проекта на старом компиляторе (GCC 5.3), в то время как новый компилятор (GCC 7.3) был получен в среде. Он отлично собирался и работал на моей машине, но как только я переместил исполняемый файл на другой компьютер, я понял, что программа связана с libstdc ++. Поэтому из
Адам Бадура
3

Экспорт должен указывать, какую версию 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.

R.Chatsiri
источник
2

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

Антонио
источник
2

Это не только работает с 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
Мартин Цайтлер
источник
0

Изменить 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 ...
Кэмерон Лоуэлл Палмер
источник