CMake에 대한 새 GCC 경로를 지정하는 방법


122

내 OS는 centos이며 경로에 기본 gcc가 /usr/bin/gcc있습니다. 그러나 그것은 오래되었고 새로운 버전의 gcc가 필요합니다. 그래서 새 경로에 새 버전을 설치합니다 /usr/local/bin/gcc.

그러나 내가 실행할 때 cmake여전히 이전 버전의 gcc path ( /usr/bin/gcc) 사용합니다. gcc를 new path ( /usr/local/bin/gcc)에 어떻게 지정할 수 있습니까 ?

나는 덮어 시도 /usr/bin/gcc와 함께 /usr/local/bin/gcc,하지만 작동하지.


2
대신에 대체 gcc 버전을 설치하는 /opt것이 좋습니다 /usr/local. 가급적 /opt/gcc-x.y.z. 이렇게하면 더 새로운 버전이 필요한 경우 이전 버전을 제거하는 데 문제가 없습니다.
user666412

답변:


219

덮어 쓰지 말고 cmake를 호출하기 전에 CMAKE_C_COMPILER내보내기 CC(및 CXX)합니다.

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

내보내기는 프로젝트를 처음 구성 할 때 한 번만 수행하면됩니다. 그러면 해당 값이 CMake 캐시에서 읽 힙니다.


업데이트 : 재정의하지 않는 이유에 대한 더 긴 설명CMAKE_C(XX)_COMPILER Jake의 의견 후에

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에 적절한 컴파일러가 설정되어있는 경우 lazy와 동일합니다.> export CC = which gcc > export CXX =which g++
gerardw

11
적절한 컴파일러가 $ PATH에 설정되어있는 경우 lazy와 동일합니다. 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

5
실제로 CMAKE_C_COMPILER명령 줄을 사용하여 설정 하면 잘 작동합니다 $ cmake -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ /path/to/source..
Erwan Legrand

25

이 질문은 꽤 오래되었지만 여전히 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쓸 수 있습니다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 ++에 링크되어 실현 대신의 7.3 ... 5.3 요청 공급 그래서에서.
아담 바두라


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++-11CMakeList.txt의 플래그를 사용하여 처리 할 수 ​​있습니다.


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 )

도구 체인 파일 사용

더 현명한 선택은 도구 모음 파일을 만드는 것입니다.

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 ...
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.