CMake için yeni GCC yolu nasıl belirtilir


122

İşletim sistemim, yolunda varsayılan bir gcc bulunan centos'tur /usr/bin/gcc. Ama eski, yeni bir gcc sürümüne ihtiyacım var. Bu yüzden yeni bir yola yeni bir sürüm kuruyorum /usr/local/bin/gcc.

Ama çalıştırdığımda cmake, hala eski sürüm gcc yolunu ( /usr/bin/gcc) kullanıyor. Gcc'yi yeni yola ( /usr/local/bin/gcc) nasıl belirtebilirim .

Ben üzerine çalıştık /usr/bin/gccile /usr/local/bin/gcc, ancak işe.


2
Bunun /optyerine alternatif gcc sürümünü yüklemenin iyi bir uygulama olduğunu düşünüyorum /usr/local. Tercihen /opt/gcc-x.y.z. Bu şekilde, daha yeni bir sürüme ihtiyacınız varsa, öncekini kaldırırken herhangi bir sorun yaşamazsınız.
user666412

Yanıtlar:


220

Üzerine yazmayın CMAKE_C_COMPILER, cmake'yi çağırmadan önce dışa aktarın CC(ve CXX):

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

Dışa aktarmanın yalnızca bir kez yapılması gerekir, projeyi ilk kez yapılandırdığınızda, bu değerler CMake önbelleğinden okunacaktır.


GÜNCELLEME : CMAKE_C(XX)_COMPILERJake'in yorumundan sonra neden geçersiz kılınmadığına dair daha uzun açıklama

CMAKE_C(XX)_COMPILERDeğerin iki ana nedenden dolayı geçersiz kılınmasını önermiyorum : CMake'nin önbelleğiyle iyi oynamayacağı ve derleyici kontrollerini ve araç tespitini bozduğu için.

setKomutu kullanırken üç seçeneğiniz vardır:

  • önbelleksiz, normal bir değişken oluşturmak için
  • önbelleğe alınmış bir değişken oluşturmak için
  • yapılandırırken önbellek değerini her zaman zorlamak için önbelleği zorla

Bakalım olası üç çağrı için ne olacak set:

Önbellek olmadan

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

Bunu yaparken CMAKE_C(XX)_COMPILER, aynı isimdeki önbellek değişkenini gizleyen "normal" bir değişken oluşturursunuz. Bu, derleyicinizin artık derleme betiğinizde sabit kodlandığı ve ona özel bir değer veremeyeceğiniz anlamına gelir. Farklı derleyicilerle birden çok derleme ortamınız varsa bu bir sorun olacaktır. Her seferinde farklı bir derleyici kullanmak istediğinizde komut dosyanızı güncelleyebilirsiniz, ancak bu, ilk etapta CMake kullanmanın değerini ortadan kaldırır.

Tamam o zaman önbelleği güncelleyelim ...

Önbellek ile

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

Bu sürüm sadece "çalışmayacaktır". CMAKE_C(XX)_COMPILERBunu zorlamak sürece değişken, önbellekte zaten bu yüzden güncellenmiş almazsınız olduğunu.

Ah ... gücü kullanalım o zaman ...

Önbelleği zorla

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

Bu neredeyse "normal" değişken sürümüyle aynıdır, tek fark, değerinizin önbellekte ayarlanacağı ve böylece kullanıcıların görebilmesidir. Ancak herhangi bir değişikliğin üzerine setkomut tarafından yazılacaktır .

Derleyici kontrollerini ve araçlarını kırma

Yapılandırma sürecinin başlarında, CMake derleyicide kontroller gerçekleştirir: Çalışıyor mu? Yürütülebilir dosyalar üretebilir mi? vb Ayrıca, ilgili araçların tespit gibi derleyici kullanır arve ranlib. Bir betikteki derleyici değerini geçersiz kıldığınızda, "çok geç" olur, tüm kontroller ve tespitler zaten yapılır.

Kullanırken Örneğin, varsayılan derleyici olarak gcc ile benim makinede, setkomutu için /usr/bin/clang, arolarak ayarlanır /usr/bin/gcc-ar-7. CMake'i çalıştırmadan önce bir dışa aktarma kullanırken, olarak ayarlanır /usr/lib/llvm-3.8/bin/llvm-ar.


$ PATH'ınızda uygun derleyiciler ayarlanmışsa tembel için eşdeğer:> export CC = which gcc > export CXX =which g++
gerardw

11
$ PATH'ınızda uygun derleyiciler ayarlanmışsa tembel için eşdeğer: export CC=`which gcc` export CXX=`which g++`
gerardw

CC / CXX yoldan farklıysa şunu anlıyorumIncorrect 'gcc' version 'compiler.version=5.3' is not the one detected by CMake: 'GNU=4.8'
Lilith River

1
Windows'daysam bunu nasıl yaparım?
mr5

5
Aslında ayar CMAKE_C_COMPILERişleri de bunu komut satırını kullanarak yapmak sağladı: $ cmake -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ /path/to/source.
Erwan Legrand

25

Bu soru oldukça eski ama yine de Google Arama'da ortaya çıkıyor. Kabul edilen soru artık benim için çalışmıyordu ve yaşlanmış görünüyor. Cmake ile ilgili en son bilgiler cmake SSS bölümünde yazılmıştır .

Derleyicinizin yolunu değiştirmenin çeşitli yolları vardır. Bir yol olurdu

Uygun CMAKE_FOO_COMPILERdeğişken (ler) i kullanarak komut satırında geçerli bir derleyici adına veya tam yola ayarlayın cmake -D. Örneğin:

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

gcc-4.2Senin yerine path/to/your/compilerböyle yazabilirsin

 cmake -D CMAKE_C_COMPILER=/path/to/gcc/bin/gcc -D CMAKE_CXX_COMPILER=/path/to/gcc/bin/g++ .

2
Bunu, eski bir derleyici (GCC 5.3) üzerinde eski bir proje oluştururken, daha yeni bir derleyici (GCC 7.3) ortamdan kaynaklanırken yapıyordum. İyi inşa edildi ve makinemde çalıştı, ancak yürütülebilir dosyayı farklı bir makineye taşıdığımda, programın libstdc ++ ile bağlantılı olduğunu fark ettim. Yani istenen 5.3 yerine kaynaklı 7.3'ten ...
Adam Badura


3

Dışa aktarma, hangi GCC / G ++ sürümünün kullanılacağı konusunda spesifik olmalıdır, çünkü kullanıcı birden çok derleyici sürümüne sahip olsaydı, başarıyla derlenemezdi.

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

Projenin C ++ 11 kullanması durumunda, bu -std=C++-11CMakeList.txt içindeki bayrak kullanılarak işlenebilir.


2

Alternatif bir çözüm, temiz bir yapı dizininden başlayarak projenizi cmake-gui aracılığıyla yapılandırmaktır. Başlangıçta sahip olduğunuz seçenekler arasında, derleyicilere giden tam yolu seçme imkanı vardır.


2

Bu sadece ile değil cmake, aynı zamanda ./configureve ile de çalışır make:

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

Hangi sonuçlanır:

checking for gcc... /usr/local/bin/gcc
checking whether the C compiler works... yes

0

CMAKE_<LANG>_COMPILERYeniden yapılandırmayı tetiklemeden yolu değiştirin

Alternatif bir derleyici ile derlemek istedim, ancak komut satırında farklı bir derleyici ayarlayarak silinecek olan -D seçeneklerini de geçirmek istedim. Bunun nedeni, yeniden yapılandırmayı tetiklemesidir. İşin püf noktası ile derleyici algılamasını devre dışı bırakmak NONE, yolları ile ayarlamak FORCE, ardından 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 )

Bir Araç Zinciri dosyası kullanın

Daha mantıklı olan seçim, bir araç zinciri dosyası oluşturmaktır.

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++" )

Sonra ek bir bayrakla Cmake'ı çağırırsınız

cmake -D CMAKE_TOOLCHAIN_FILE=/path/to/toolchain_file.cmake ...
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.