2017-03-16 8 views
15

जीसीसी 4.xसी ++ 14 कोड के लिए स्विच स्वीकार नहीं करता है - इसके बजाय --std=c++1y लेता है। बाद के संस्करण --std=c++1z लेते हैं लेकिन (शायद) --std=c++17 नहीं है जो अभी तक सेट नहीं किया गया है (2016 में इसे लिखना)। शायद सी ++ 11 के साथ समान समस्याएं हैं।सीएमके को जीसीसी संस्करण के आधार पर या तो std = C++ 14/C++ 1y या C++ 17/C++ 1z पास करने के लिए कैसे प्राप्त करें?

क्या सीसीसीके में जीसीसी संस्करण के अनुसार सही स्विच पास करने के लिए कुछ सुविधा (शायद एक मॉड्यूल के रूप में) है?

+0

* "शायद सी ++ 11 के साथ समान समस्याएं हैं।" * यह सी ++ 11 बनाम सी ++ 0x होगा, जिसे पहले जीसीसी 4.7/8 में पेश किया जा रहा है। –

+0

बीटीडब्ल्यू, पुराने स्विच (0x, 1y, 1z) आधुनिक लोगों का समर्थन करने वाले कंपाइलरों पर भी ठीक काम करते हैं, इसलिए इस "सही" को पाने के लिए कोई वास्तविक * आवश्यकता नहीं है। –

+1

** ** ** कच्चे कंपाइलर झंडे को पार करने के बाद से यह "दाएं" प्राप्त करने की आवश्यकता है, एक सीएमके विरोधी पैटर्न है और मेटा-बिल्ड सिस्टम/बिल्ड सिस्टम जेनरेटर की पूरी अवधारणा के खिलाफ है। –

उत्तर

30

जब एक विशेष सी ++ संस्करण निर्दिष्ट करने के लिए इच्छुक तरह शायद कुछ, CMake 3.1 के साथ ऐसा कर और बाद में एक सुझाया गया तरीका लक्ष्य चूक निर्दिष्ट करने के लिए CXX_STANDARD, CXX_STANDARD_REQUIRED और CXX_EXTENSIONS लक्ष्य गुण, या उनके चर समकक्ष उपयोग करने के लिए है । पूर्ण विवरण here पाया जा सकता है, लेकिन लघु संस्करण कुछ इस तरह चला जाता है:

cmake_minimum_required(VERSION 3.1) 
project(Example) 

set(CMAKE_CXX_STANDARD 14) 
set(CMAKE_CXX_STANDARD_REQUIRED ON) 
set(CMAKE_CXX_EXTENSIONS OFF) 
# ... Define targets, etc. as usual 

CMake तो अनुरोध किया सी ++ के आधार पर मानक के लिए उपयुक्त संकलक ध्वज का चयन करना चाहिए क्या संकलक का समर्थन करता है, या बाहर त्रुटि है, तो यह नहीं करता है अनुरोधित मानक का समर्थन नहीं करते हैं।

यह भी ध्यान दिया जाना चाहिए कि सीएमके CXX_STANDARD लक्षित संपत्ति द्वारा निर्दिष्ट एक से अधिक भाषा मानक का उपयोग करने के लिए लक्ष्य को अपग्रेड कर सकता है। compile feature requirements का उपयोग (जैसा कि @FlorianWolters उत्तर में उल्लिखित है) भाषा मानक आवश्यकता को बढ़ा सकता है। वास्तव में, सीएमके हमेशा CXX_STANDARD लक्षित संपत्ति या लक्ष्य पर सेट संकलन सुविधा आवश्यकताओं द्वारा निर्दिष्ट मजबूत भाषा आवश्यकता को उठाएगा। ध्यान दें कि 3.10.1 के रूप में सीएमके दस्तावेज CXX_EXTENSIONS संकलित सुविधाओं के साथ इंटरैक्ट करता है, CXX_EXTENSIONS केवलको सबसे आम कंपाइलर्स के लिए भी निर्दिष्ट किया जाता है (क्योंकि उन्हें एक कंपाइलर ध्वज के साथ निर्दिष्ट किया जाता है)।

7

जांचें कि क्या कंपाइलर झंडे का समर्थन करता है?

include(CheckCXXCompilerFlag) 

# Check for standard to use 
check_cxx_compiler_flag(-std=c++17 HAVE_FLAG_STD_CXX17) 
if(HAVE_FLAG_STD_CXX17) 
    # Have -std=c++17, use it 
else() 
    check_cxx_compiler_flag(-std=c++1z HAVE_FLAG_STD_CXX1Z) 
    if(HAVE_FLAG_STD_CXX1Z) 
     # Have -std=c++1z, use it 
    else() 
     # And so on and on... 
    endif() 
endif() 
+2

@inpoklum कोई अटकलें नहीं, मैं बिना किसी समस्या के कुछ वर्षों के लिए इस सटीक कोड का उपयोग कर रहा हूं। जीसीसी और क्लैंग दोनों के साथ (जो मैंने पिछली बार कोशिश की थी '-std = C++ 17' विकल्प का समर्थन नहीं किया)। –

7

आधुनिक सीएमके कोड को एक विशिष्ट सी ++ मानक का अनुरोध करने के लिए target_compile_features कमांड का उपयोग करना चाहिए। इसे केवल बिल्ड आवश्यकता के रूप में निर्दिष्ट किया जा सकता है (PRIVATE), उपयोग आवश्यकता केवल (INTERFACE) या निर्माण और उपयोग आवश्यकता (PUBLIC)।

उदाहरण:

cmake_minimum_required(VERSION 3.9.4) 

project(cpp-snippets) 
add_executable(cpp-snippets "main.cpp") 
target_compile_features(cpp-snippets PRIVATE cxx_std_17) 

अनुभाग cmake-compile-features के लिए सरकारी CMake दस्तावेज में भाषा मानक की आवश्यकता होती है और जानने के लिए देखें।

+0

"उपयोग आवश्यकताओं" के विपरीत "निर्माण आवश्यकताओं" क्या हैं? – einpoklum

+2

यह भी हाइलाइट किया जाना चाहिए कि 'cxx_std_YY' मेटा सुविधा के लिए समर्थन भी सीएमके 3 में जोड़ा गया था।8, जबकि लक्षित गुणों का 'CXX_STANDARD' परिवार बहुत लंबा रहा है और 'cxx_std_YY' मेटा सुविधाएं अकेले ही नियंत्रित नहीं करती हैं कि संकलक एक्सटेंशन का उपयोग किया जा सकता है या नहीं। –

+1

@einpoklum उत्तर में उपयोग किए जाने पर, _build requirement_ लक्ष्य को स्वयं बनाने के लिए आवश्यक चीजों का संदर्भ लेता है, जबकि _usage आवश्यकताएं_ ऐसी चीजें हैं जो लक्ष्य के विरुद्ध लिंक करने वाली किसी भी आवश्यकता के रूप में प्राप्त होंगी। –

संबंधित मुद्दे