Как указать новый путь 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 и замена для него места по умолчанию).