cmake

2013-06-24 12 views
53

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

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

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

उत्तर

114

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 का कैश के साथ और क्योंकि यह अच्छी तरह से नहीं खेलेंगे: क्यों जेक की टिप्पणी

मैं दो मुख्य कारणों से 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 जैसे संबंधित उपकरणों का पता लगाने के लिए कंपाइलर का भी उपयोग करता है। जब आप किसी स्क्रिप्ट में कंपाइलर मान को ओवरराइड करते हैं, तो यह "बहुत देर हो चुकी है", सभी चेक और डिटेक्शन पहले से ही किए जा चुके हैं।

उदाहरण के लिए, डिफ़ॉल्ट संकलक के रूप में जीसीसी के साथ अपने मशीन पर, जब /usr/bin/clang को set आदेश का उपयोग, ar/usr/bin/gcc-ar-7 को तैयार है। सीएमके चलाने से पहले निर्यात का उपयोग करते समय इसे /usr/lib/llvm-3.8/bin/llvm-ar पर सेट किया गया है।

+0

हाँ के लिए सही पथ चुनने की संभावना है, यह काम करता है! धन्यवाद @ गुइल्यूम! – tidy

+0

आलसी के लिए समतुल्य, यदि उचित कंपाइलर आपके $ पाथ में सेट हैं: > निर्यात सीसी = 'जीसीसी > निर्यात सीXX =' जी ++ ' – gerardw

+7

आलसी के लिए समतुल्य, यदि उचित कंपेलर आपके $ में सेट हैं पथ: 'निर्यात सीसी = \ 'जो जीसीसी \' निर्यात CXX = \ 'कौन सा g ++ \' ' – gerardw

2

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

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

मामले परियोजना उपयोग में सी ++ 11 इस

2

एक वैकल्पिक समाधान CMakeList.txt में -std=C++-11 ध्वज का उपयोग द्वारा नियंत्रित किया जा सकता है, cmake-जीयूआई के माध्यम से अपनी परियोजना को कॉन्फ़िगर करने के लिए है एक साफ निर्माण निर्देशिका से शुरू । शुरुआत में उपलब्ध विकल्पों में से, कंपाइलर्स