วิธีระบุเส้นทาง GCC ใหม่สำหรับ CMake


122

ฉัน OS เป็น CentOS ซึ่งมี GCC /usr/bin/gccเริ่มต้นในเส้นทาง แต่มันเก่าฉันต้องการ gcc เวอร์ชันใหม่ /usr/local/bin/gccดังนั้นผมจึงติดตั้งรุ่นใหม่ในเส้นทางใหม่

แต่เมื่อฉันเรียกใช้cmakeมันยังคงใช้เส้นทาง gcc ( /usr/bin/gcc) เวอร์ชันเก่า ฉันจะระบุ gcc ไปยังเส้นทางใหม่ ( /usr/local/bin/gcc) ได้อย่างไร

ฉันได้พยายามที่จะเขียนทับ/usr/bin/gccด้วย/usr/local/bin/gccแต่มันไม่ทำงาน


2
ฉันคิดว่ามันเป็นวิธีที่ดีที่จะติดตั้งรุ่น GCC อื่นเข้ามามากกว่า/opt โดยเฉพาะอย่างยิ่ง/usr/local /opt/gcc-x.y.zด้วยวิธีนี้หากคุณต้องการเวอร์ชันที่ใหม่กว่าคุณจะไม่มีปัญหาในการถอนการติดตั้งเวอร์ชันก่อนหน้า
user666412

คำตอบ:


220

อย่าเขียนทับ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


UPDATE : คำอธิบายอีกต่อไปว่าทำไมไม่ลบล้าง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 ของคุณ:> export CC = which gcc > export CXX =which g++
gerardw

11
เทียบเท่ากับคนขี้เกียจหากคอมไพเลอร์ที่เหมาะสมถูกตั้งค่าไว้ใน $ PATH ของคุณ: 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 Search คำถามที่ได้รับการยอมรับไม่ได้ผลสำหรับฉันอีกต่อไปและดูเหมือนว่าจะมีอายุมากแล้ว ข้อมูลล่าสุดเกี่ยวกับ CMake เขียนในCMake คำถามที่พบบ่อย

มีหลายวิธีในการเปลี่ยนเส้นทางของคอมไพเลอร์ของคุณ วิธีหนึ่งก็คือ

การตั้งค่าที่เหมาะสมCMAKE_FOO_COMPILERตัวแปร (s) 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 ที่ร้องขอ
Adam Badura


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++-11แฟล็กใน CMakeList.txt


2

อีกทางเลือกหนึ่งคือกำหนดค่าโปรเจ็กต์ของคุณผ่าน cmake-gui โดยเริ่มจากไดเร็กทอรี build ที่สะอาด ในบรรดาตัวเลือกที่คุณมีให้ในตอนแรกมีความเป็นไปได้ที่จะเลือกเส้นทางที่แน่นอนไปยังคอมไพเลอร์


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กำหนดเส้นทางที่มีแล้วFORCEenable_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

ทางเลือกที่เหมาะสมกว่าคือการสร้างไฟล์ 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 ...
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.