답변:
덮어 쓰지 말고 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
.
which gcc
> export CXX =which g++
export CC=`which gcc` export CXX=`which g++`
Incorrect 'gcc' version 'compiler.version=5.3' is not the one detected by CMake: 'GNU=4.8'
CMAKE_C_COMPILER
명령 줄을 사용하여 설정 하면 잘 작동합니다 $ cmake -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ /path/to/source
..
이 질문은 꽤 오래되었지만 여전히 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++ .
CMAKE_C_COMPILER
새 경로로 설정 하십시오.
여기를 참조하십시오 : http://www.cmake.org/Wiki/CMake_Useful_Variables
내보내기는 사용할 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_<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 ...
/opt
것이 좋습니다/usr/local
. 가급적/opt/gcc-x.y.z
. 이렇게하면 더 새로운 버전이 필요한 경우 이전 버전을 제거하는 데 문제가 없습니다.