सीएमके लिए नए जीसीसी पथ को कैसे निर्दिष्ट करें


122

मेरा OS सेंटोस है जिसकी पथ में डिफ़ॉल्ट gcc है /usr/bin/gcc। लेकिन यह पुराना है, मुझे जीसीसी का एक नया संस्करण चाहिए। इसलिए मैं एक नए पथ में एक नया संस्करण स्थापित करता हूं /usr/local/bin/gcc

लेकिन जब मैं दौड़ता हूं cmake, तब भी यह पुराने संस्करण gcc पाथ ( /usr/bin/gcc) का उपयोग करता है । मैं gcc को नए पथ पर कैसे निर्दिष्ट कर सकता हूं ( /usr/local/bin/gcc)।

मैंने इसके /usr/bin/gccसाथ ओवरराइट करने की कोशिश की है /usr/local/bin/gcc, लेकिन यह काम नहीं कर रहा है।


2
मुझे लगता है कि इसके /optबजाय वैकल्पिक gcc संस्करण को स्थापित करना एक अच्छा अभ्यास है /usr/local। अधिमानतः /opt/gcc-x.y.z। इस तरह, यदि आपको एक और भी नए संस्करण की आवश्यकता है, तो आपको पहले वाले को अनइंस्टॉल करने में कोई परेशानी नहीं होगी।
user666412

जवाबों:


219

सेमीक को कॉल करने से पहले अधिलेखित न करें CMAKE_C_COMPILER, लेकिन निर्यात CC(और CXX) करें:

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

निर्यात केवल एक बार किया जाना चाहिए, पहली बार जब आप परियोजना को कॉन्फ़िगर करते हैं, तो उन मूल्यों को सीएमके कैश से पढ़ा जाएगा।


अद्यतन : अब CMAKE_C(XX)_COMPILERजेक की टिप्पणी के बाद ओवरराइडिंग क्यों नहीं पर स्पष्टीकरण

मैं CMAKE_C(XX)_COMPILERदो मुख्य कारणों के लिए मूल्य को ओवरराइड करने के खिलाफ सलाह देता हूं : क्योंकि यह सीएमके कैश के साथ अच्छा नहीं खेलेगा और क्योंकि यह कंपाइलर चेक और टूलिंग डिटेक्शन को तोड़ता है।

setकमांड का उपयोग करते समय , आपके पास तीन विकल्प हैं:

  • कैश के बिना, एक सामान्य चर बनाने के लिए
  • कैश के साथ, कैश्ड वैरिएबल बनाने के लिए
  • कैश को बल दें, कॉन्फ़िगर करते समय हमेशा कैश मान को मजबूर करने के लिए

आइए देखें कि तीन संभावित कॉल के लिए क्या होता है set:

बिना कैश के

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

ऐसा करते समय, आप एक "सामान्य" चर बनाते CMAKE_C(XX)_COMPILERहैं जो उसी नाम के कैश चर को छुपाता है। इसका मतलब है कि आपका कंपाइलर अब आपकी बिल्ड स्क्रिप्ट में हार्ड-कोडेड है और आप इसे कस्टम वैल्यू नहीं दे सकते। यदि आपके पास अलग-अलग संकलक के साथ कई बिल्ड वातावरण हैं तो यह एक समस्या होगी। जब भी आप एक अलग संकलक का उपयोग करना चाहते हैं तो आप हर बार अपनी स्क्रिप्ट को अपडेट कर सकते हैं, लेकिन यह पहली बार में सीएमके का उपयोग करने के मूल्य को हटा देता है।

ठीक है, तो, चलो कैश अद्यतन करें ...

कैश के साथ

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


आलसी के लिए समान, यदि उचित संकलक आपके $ पैट में सेट किए गए हैं:> निर्यात CC = which gcc > निर्यात CXX =which g++
gerardw

11
आलसी के लिए समतुल्य, यदि उचित संकलक आपके $ पैट में सेट किए गए हैं: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'
लिलिथ रिवर

1
अगर मैं विंडोज पर हूं तो मैं यह कैसे करूं?
mr5

5
वास्तव में, सेटिंग CMAKE_C_COMPILERअच्छी तरह से काम करती है बशर्ते आप इसे कमांड लाइन का उपयोग करके करें $ cmake -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ /path/to/source:।
एरवन लीग्रैंड

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) को पर्यावरण में खटास आ गई थी। यह ठीक है और मेरी मशीन पर काम किया है, लेकिन एक बार जब मैं एक अलग मशीन के लिए निष्पादन योग्य स्थानांतरित कर दिया तो मुझे एहसास हुआ कि कार्यक्रम libddcc ++ से जुड़ा हुआ है। इसलिए अनुरोधित 5.3 के बजाय खट्टे 7.3 से ...
एडम बडूरा


3

निर्यात जीसीसी / जी ++ के किस संस्करण का उपयोग करने के लिए विशिष्ट होना चाहिए, क्योंकि यदि उपयोगकर्ता के पास कई संकलक संस्करण थे, तो यह सफलतापूर्वक संकलित नहीं होगा।

 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

एक वैकल्पिक समाधान है अपनी परियोजना को सीमेक-गुई के माध्यम से कॉन्फ़िगर करना, एक स्वच्छ बिल्ड निर्देशिका से शुरू करना। आपके पास शुरुआत में उपलब्ध विकल्पों में से, कंपाइलरों के लिए सटीक मार्ग चुनने की संभावना है


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पुन: कॉन्फ़िगर करने के बिना पथ बदलें

मैं एक वैकल्पिक संकलक के साथ संकलन करना चाहता था, लेकिन कमांड-लाइन पर पास-डी विकल्प भी था जो एक अलग संकलक स्थापित करके मिटा दिया जाएगा। ऐसा इसलिए होता है क्योंकि यह पुनः कॉन्फ़िगर होता है। चाल के साथ संकलक का पता लगाने को अक्षम 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 ...
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.