2017-08-15 9 views
9

मैं वीएस 15.3 का उपयोग कर रहा हूं, जो एकीकृत सीमेक 3.8 का समर्थन करता है। मैं प्रत्येक विशिष्ट कंपेलरों के लिए झंडे लिखने के बिना सी ++ 17 को कैसे लक्षित कर सकता हूं? मेरे वर्तमान वैश्विक सेटिंग्स काम नहीं:सीएम + 0 में सी ++ 17 को सक्षम करने के लिए कैसे करें

# https://cmake.org/cmake/help/latest/prop_tgt/CXX_STANDARD.html 
set(CMAKE_CXX_STANDARD 17) 
set(CMAKE_CXX_STANDARD_REQUIRED ON) 
set(CMAKE_CXX_EXTENSIONS OFF) 

# expected behaviour 
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++lastest") 

मैं CMake "/ एसटीडी: C++ नवीनतम" जोड़ने के लिए की उम्मीद जब वी.एस. समाधान फ़ाइलें पैदा करने या समकक्ष है, लेकिन कोई C++ 17 झंडे पाया गया था, में हुई संकलक त्रुटि:

C1189 #error: class template optional is only available with C++17. 
+1

सामान्य रूप में CMake प्रत्येक विशिष्ट संकलक के लिए झंडे लिखने के लिए की आवश्यकता को समाप्त नहीं करता है। – VTT

+1

"वीएस 15.3" के साथ आपका मतलब विजुअल स्टूडियो 2017 पूर्वावलोकन 3 है? या आपका मतलब है कि विजुअल स्टूडियो 2015 अपडेट 3 (जो अधिक समर्थन नहीं करता है, अगर कोई है, सी ++ 17)? –

+0

@ Somprogrammerdude मैं 'std :: वैकल्पिक' सुविधाओं का उपयोग कर रहा हूं, जिसका उपयोग मैं किया जा सकता है अगर मैं '/ std: C++ सबसे आखिरी"' सीएमकेक्सलिस्ट को मैन्युअल रूप से ध्वजांकित करता हूं '। – MiP

उत्तर

6

CMake 3.9 documentation से:

For compilers that have no notion of a standard level, such as MSVC, this has no effect.

संक्षेप में, CMake के लिए समायोजित करने के लिए अद्यतन नहीं किया गया वीसी ++ 2017 में मानक झंडे जोड़े गए।

आपको यह पता लगाना होगा कि वीसी ++ 2017 (या बाद में) का उपयोग किया जाता है और अब इसके लिए संबंधित झंडे जोड़ते हैं।


सीएमके 3.10 (और बाद में) में यह वीसी ++ के नए संस्करण के लिए तय किया गया है। the 3.10 documentation देखें।

+2

नया सीएमके 3.10 (और बाद में) दस्तावेज कहता है कि यह विजुअल स्टूडियो 2015 अपडेट 3 या नए के लिए काम करता है। 2015 अपडेट 3 से पहले केवल विजुअल स्टूडियो संस्करण समर्थित नहीं हैं। उपरोक्त लिंक वास्तव में नवीनतम दस्तावेज पर जाता है, जो इसे दर्शाता है। – Marcus10110

+1

@ मार्कस 10110 सही, लिंक को 3.9 दस्तावेज को इंगित करने के लिए बदल दिया। और नए संस्करणों के लिए तय किए जाने के बारे में अतिरिक्त नोट। धन्यवाद। –

2

आप रख सकते हैं कि अन्य compilers, बजना और जीसीसी की तरह के लिए set(CMAKE_CXX_STANDARD 17)। लेकिन विजुअल स्टूडियो के लिए, यह बेकार है।

CMake अभी भी इस का समर्थन नहीं करता, तो आप निम्न कर सकते हैं:

if(MSVC) 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++17") 
endif(MSVC) 
+1

[हालिया वीएस परिवर्तन] (https://docs.microsoft.com/en-us/cpp/what-s-new-for-visual-cpp -इन-विज़ुअल-स्टूडियो) '/ std: C++ 14','/std: C++ 17' और '/ std: C++ नवीनतम' झंडे का उपयोग करके मानक सेट करने की अनुमति देता है। – VTT

+0

@ वीटीटी ओह! मुझे सही साबित होना है! –

1

आधुनिक सीएमके में, मुझे वैश्विक परिवर्तनीय स्तर के बजाय लक्ष्य स्तर पर सीआईसी मानकों को असाइन करना सर्वोत्तम है और इसे कंपाइलर अज्ञेयवादी रखने के लिए निर्मित गुणों का उपयोग करें (यहां देखा गया: https://cmake.org/cmake/help/latest/manual/cmake-properties.7.html)।

उदाहरण के लिए:

set_target_properties(FooTarget PROPERTIES 
      CXX_STANDARD_REQUIRED 17 
      CXX_EXTENSIONS OFF 
      etc.. 
      ) 
संबंधित मुद्दे