Cara menentukan jalur GCC baru untuk CMake

122

OS saya adalah centos yang memiliki gcc default di jalurnya /usr/bin/gcc. Tapi sudah lama, saya butuh versi gcc yang baru. Jadi saya menginstal versi baru di jalur baru /usr/local/bin/gcc.

Namun saat dijalankan cmake, masih menggunakan versi lama gcc path ( /usr/bin/gcc). Bagaimana cara menetapkan gcc ke jalur baru ( /usr/local/bin/gcc).

Saya telah mencoba untuk menimpa /usr/bin/gccdengan /usr/local/bin/gcc, tetapi tidak berhasil.

rapi
sumber
2
Saya pikir itu adalah praktik yang baik untuk menginstal versi gcc alternatif /optdaripada /usr/local. Lebih disukai /opt/gcc-x.y.z. Dengan cara ini, jika Anda membutuhkan versi yang lebih baru, Anda tidak akan kesulitan mencopot pemasangan yang sebelumnya.
pengguna666412

Jawaban:

220

Jangan menimpa CMAKE_C_COMPILER, tapi ekspor CC(dan CXX) sebelum memanggil cmake:

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

Ekspor hanya perlu dilakukan satu kali, pertama kali Anda mengonfigurasi proyek, nilai tersebut akan dibaca dari cache CMake.


UPDATE : penjelasan lebih panjang tentang mengapa tidak menimpa CMAKE_C(XX)_COMPILERsetelah komentar Jake

Saya merekomendasikan untuk tidak menimpa CMAKE_C(XX)_COMPILERnilai karena dua alasan utama: karena itu tidak akan berfungsi dengan baik dengan cache CMake dan karena itu merusak pemeriksaan kompiler dan deteksi perkakas.

Saat menggunakan setperintah, Anda memiliki tiga opsi:

  • tanpa cache, untuk membuat variabel normal
  • dengan cache, untuk membuat variabel cache
  • memaksa cache, untuk selalu memaksa nilai cache saat mengkonfigurasi

Mari kita lihat apa yang terjadi untuk tiga kemungkinan panggilan ke set:

Tanpa cache

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

Saat melakukan ini, Anda membuat variabel "normal" CMAKE_C(XX)_COMPILERyang menyembunyikan variabel cache dengan nama yang sama. Artinya, compiler Anda sekarang telah di-hardcode dalam skrip build Anda dan Anda tidak dapat memberikannya nilai kustom. Ini akan menjadi masalah jika Anda memiliki beberapa lingkungan build dengan kompiler berbeda. Anda bisa memperbarui skrip Anda setiap kali Anda ingin menggunakan kompiler yang berbeda, tetapi itu menghapus nilai menggunakan CMake di tempat pertama.

Oke, kalau begitu, mari perbarui cache ...

Dengan cache

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

Versi ini hanya akan "tidak berfungsi". The CMAKE_C(XX)_COMPILERvariabel sudah dalam cache, sehingga tidak akan diperbarui kecuali Anda memaksa itu.

Ah ... ayo gunakan kekuatan, lalu ...

Paksa cache

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

Ini hampir sama dengan versi variabel "normal", satu-satunya perbedaan adalah nilai Anda akan disetel di cache, sehingga pengguna dapat melihatnya. Tetapi setiap perubahan akan ditimpa oleh setperintah.

Memecah pemeriksaan dan perkakas kompiler

Pada awal proses konfigurasi, CMake melakukan pemeriksaan pada kompiler: Apakah berhasil? Apakah itu mampu menghasilkan executable? dll. Ia juga menggunakan kompiler untuk mendeteksi perkakas terkait, seperti ardan ranlib. Saat Anda mengganti nilai compiler dalam skrip, ini "terlambat", semua pemeriksaan dan deteksi sudah selesai.

Misalnya, di komputer saya dengan gcc sebagai kompilator default, saat menggunakan setperintah ke /usr/bin/clang, ardisetel ke /usr/bin/gcc-ar-7. Saat menggunakan ekspor sebelum menjalankan CMake, ini disetel ke /usr/lib/llvm-3.8/bin/llvm-ar.

Guillaume
sumber
Setara dengan lazy, jika kompiler yang tepat disetel di $ PATH Anda:> export CC = which gcc > export CXX =which g++
gerardw
11
Setara dengan lazy, jika kompiler yang tepat disetel di $ PATH Anda: export CC=`which gcc` export CXX=`which g++`
gerardw
Jika CC / CXX berbeda dari jalur, saya mendapatkanIncorrect 'gcc' version 'compiler.version=5.3' is not the one detected by CMake: 'GNU=4.8'
Sungai Lilith
1
Bagaimana saya melakukan ini jika saya menggunakan Windows?
mr5
5
Sebenarnya, pengaturan CMAKE_C_COMPILERbekerja dengan baik asalkan Anda melakukannya dengan menggunakan baris perintah: $ cmake -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ /path/to/source.
Erwan Legrand
25

Pertanyaan ini sudah cukup lama tetapi masih muncul di Google Penelusuran. Pertanyaan yang diterima tidak lagi bekerja untuk saya dan tampaknya sudah tua. Informasi terbaru tentang cmake tertulis di FAQ cmake .

Ada berbagai cara untuk mengubah jalur kompilator Anda. Salah satu caranya

Setel CMAKE_FOO_COMPILERvariabel yang sesuai ke nama kompilator yang valid atau jalur lengkap pada baris perintah menggunakan cmake -D. Sebagai contoh:

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

alih-alih gcc-4.2Anda bisa menulis path/to/your/compilerseperti ini

 cmake -D CMAKE_C_COMPILER=/path/to/gcc/bin/gcc -D CMAKE_CXX_COMPILER=/path/to/gcc/bin/g++ .
lambda
sumber
2
Saya melakukannya sambil membangun proyek lama di kompiler lama (GCC 5.3) sementara kompiler baru (GCC 7.3) bersumber di lingkungan. Itu dibangun dengan baik dan bekerja pada mesin saya, tetapi begitu saya memindahkan executable ke mesin lain, saya menyadari bahwa program tersebut ditautkan ke libstdc ++. Jadi dari sumber 7,3 alih-alih yang diminta 5,3 ...
Adam Badura
3

Ekspor harus spesifik tentang versi GCC / G ++ yang akan digunakan, karena jika pengguna memiliki beberapa versi kompilator, itu tidak akan berhasil dikompilasi.

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

Jika proyek menggunakan C ++ 11, ini dapat ditangani dengan menggunakan -std=C++-11flag di CMakeList.txt

R.Chatsiri
sumber
2

Solusi alternatifnya adalah mengonfigurasi proyek Anda melalui cmake-gui, mulai dari direktori build yang bersih. Di antara opsi yang Anda miliki di awal, ada kemungkinan untuk memilih jalur yang tepat ke kompiler

Antonio
sumber
2

Ini tidak hanya bekerja dengan cmake, tetapi juga dengan ./configuredan make:

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

Yang menghasilkan:

checking for gcc... /usr/local/bin/gcc
checking whether the C compiler works... yes
Martin Zeitler
sumber
0

Ubah CMAKE_<LANG>_COMPILERjalur tanpa memicu konfigurasi ulang

Saya ingin mengkompilasi dengan kompiler alternatif, tetapi juga memberikan opsi -D pada baris perintah yang akan dihapus dengan mengatur kompiler yang berbeda. Ini terjadi karena memicu konfigurasi ulang. Triknya adalah dengan menonaktifkan deteksi kompilator dengan NONE, setel jalur dengan FORCE, lalu 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 )

Gunakan file Toolchain

Pilihan yang lebih masuk akal adalah membuat file 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++" )

Kemudian Anda memanggil Cmake dengan bendera tambahan

cmake -D CMAKE_TOOLCHAIN_FILE=/path/to/toolchain_file.cmake ...
Cameron Lowell Palmer
sumber