আমি কীভাবে সিএমকে সি ++ 11 সক্রিয় করব?


356

আমি যখন আমার প্রোগ্রামটি সংকলন করতে একটি সিএমকে উত্পন্ন মেকফিল চালানোর চেষ্টা করি তখন আমি ত্রুটিটি পাই

লুপের জন্য ভিত্তিক পরিসর সি ++ 98 মোডে সমর্থিত নয়।

আমি add_definitions(-std=c++0x)আমার সাথে যুক্ত করার চেষ্টা করেছি CMakeLists.txt, তবে তাতে কোনও লাভ হয়নি।

আমি এটিও চেষ্টা করেছি:

if(CMAKE_COMPILER_IS_GNUCXX)
    add_definitions(-std=gnu++0x)
endif()

আমি যখন করি তখন আমি g++ --versionপাই:

g ++ (উবুন্টু / লিনারো 4.6.1-9ubuntu3) 4.6.1

আমি চেষ্টা করেছি SET(CMAKE_CXX_FLAGS "-std=c++0x"), যা কাজ করে না।

আমি বুঝতে পারি না কীভাবে আমি সিএমকে ব্যবহার করে সি ++ 11 বৈশিষ্ট্যগুলি সক্রিয় করতে পারি।


11
SET(CMAKE_CXX_FLAGS "-std=c++0x")আমার জন্য কাজ করে জরিমানা, তাই সম্ভবত CMakeLists ফাইলে অন্য কোথাও কোন সমস্যা নয়। নিশ্চিত হয়ে নিন যে আপনি পরে ভুলক্রমে CMAKE_CXX_FLAGS এর সামগ্রীগুলি ওভাররাইট করবেন না।
কমিকসানসএমএস

7
add_definitions (-std = c ++ 11) সিএমকে ২.৮.৮ নিয়ে আমার জন্য কাজ করে
কিয়াকু

@ComicSansMS: আপনি পুরোপুরি ঠিক! আমি এটি ওভাররোট করেছি, যা আমার নিজের ভুল ছিল। আমি এটি সংশোধন করেছি, এবং এখন এটি ঠিক কাজ করছে! সি ++ 11 স্টাফ খুব দুর্দান্ত! আমি কাঠামোগুলির একটি ভেক্টর লুপ করতে চেয়েছিলাম, যার জন্য আমার কাছে লুপগুলির জন্য বেজ ভিত্তিক পরিসর না থাকলে পুনরাবৃত্তকারী এবং অযথা কোডিং শব্দের প্রয়োজন হবে। আমার ধারণা আমি যদিও BOOST_FOREach ব্যবহার করতে পারি তবে ওহ ভাল ...
সুবহমাই এস

32
সিএমকে ≥3.1 এর জন্য, set(CMAKE_CXX_STANDARD 11)(লক্ষ্য নির্ধারণের আগে) সেরা উপায়।
Emlai

@tuple_cat আপনি লক্ষ্য-ভিত্তিক এটিও করতে পারেন। তবে সচেতন থাকুন যা এমএসভিসিতে কাজ CXX_STANDARDকরে না , সুতরাং মূলত আপনাকে target_compile_featuresযদি ক্রস প্ল্যাটফর্মের কাজ করে এমন কিছু চান তবে আপনাকে ফিরে যেতে হবে।
Ela782

উত্তর:


395

সিএমকে ৩.১ আপনি ব্যবহার করতে পারেন এমন CMAKE_CXX_STANDARD ভেরিয়েবল প্রবর্তন করেছিলেন । আপনি যদি জানেন যে আপনার কাছে সবসময় সিএমকে ৩.১ পাওয়া যায়, আপনি কেবল এটি আপনার শীর্ষ-স্তরের সিএমকেলিস্ট.টিএসটি ফাইলটিতে লিখতে পারেন বা কোনও নতুন লক্ষ্য সংজ্ঞায়িত করার আগে এটি ঠিক রেখে দিতে পারেন:

set (CMAKE_CXX_STANDARD 11)

আপনার যদি সিএমকের পুরানো সংস্করণগুলি সমর্থন করার দরকার হয় তবে আপনি এখানে যে ম্যাক্রোটি ব্যবহার করতে পারেন তা এখানে এসেছি:

macro(use_cxx11)
  if (CMAKE_VERSION VERSION_LESS "3.1")
    if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
      set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
    endif ()
  else ()
    set (CMAKE_CXX_STANDARD 11)
  endif ()
endmacro(use_cxx11)

ম্যাক্রো এখনই কেবল জিসিসি সমর্থন করে তবে অন্যান্য সংকলকগুলিতে এটি প্রসারিত করার জন্য এটি সরাসরি-এগিয়ে হওয়া উচিত।

তারপরে আপনি use_cxx11()যে কোনও সিএমকেলিস্ট.টেক্সট ফাইলের শীর্ষে লিখতে পারেন যা সি ++ 11 ব্যবহার করে এমন একটি লক্ষ্য নির্ধারণ করে।

ম্যাকসকে টার্গেট করে বাজে ব্যবহারকারীদের জন্য সিএমকে ইস্যু করুন # 15943

আপনি যদি ম্যাকোসকে লক্ষ্য করে সিএমকে এবং ঝাঁকুনি ব্যবহার করছেন তবে এমন একটি বাগ রয়েছে যা CMAKE_CXX_STANDARDবৈশিষ্ট্যটি কেবল কাজ না করার কারণ হতে পারে (কোনও সংকলক পতাকা যুক্ত করবেন না)। আপনি নিম্নলিখিত বিষয়গুলির মধ্যে একটি করেছেন তা নিশ্চিত করুন:

  • ব্যবহারের cmake_minimum_required পরে CMake 3.0 প্রয়োজন বা, বা
  • projectকমান্ডের আগে আপনার সিএমকেলিস্ট.টেক্সট ফাইলের শীর্ষে নীচের কোডটি দিয়ে নতুনতে নীতি সিএমপি 10025 সেট করুন :

    # Fix behavior of CMAKE_CXX_STANDARD when targeting macOS.
    if (POLICY CMP0025)
      cmake_policy(SET CMP0025 NEW)
    endif ()

12
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। এটি পৃথকভাবে প্রতিটি টার্গেটের বৈশিষ্ট্য স্পর্শ করার প্রয়োজন হয় না এবং ক্রস প্ল্যাটফর্মের কাজ করে।
দেবসোলার

4
সম্মত, এটি সিএমকে ৩.১+ হিসাবে স্বীকৃত উত্তর হওয়া উচিত। এটি ম্যাকের জন্য আমার পক্ষে কাজ করবে বলে মনে হচ্ছে না। আপনি ম্যাকের ডিফল্ট --stdlib = libc ++ সহ আপনাকে --std = c ++ 11 দিতে বাধ্য করতে পারেন। পরিবর্তে CMAKE_CXX_STANDARD এর সমর্থিত থাকলে gnu এক্সটেনশানগুলি সর্বদা অন্তর্ভুক্ত করে এবং ফলাফলটি --stdlib = libc ++ এর বিরুদ্ধে তৈরি বলে মনে হয় না। পরিবর্তে আপনাকে gnu's --stdlib = libstdc ++ এ যেতে হবে। ম্যাক যদিও বিশেষ ক্ষেত্রে। লিনাক্সের জন্য, libstdc ++ সহ gnu ++ 11 নির্বাচন করা আদর্শ। অবশ্যই, পতাকাগুলির সাথে সামঞ্জস্য করার জন্য এটি একটি (অ্যাপল) add_compile_options () দিয়ে সহজেই সংশোধন করা হয়।
আতিফম

2
এই পদ্ধতির একটি সমস্যা হ'ল এটি gnu++11প্রয়োগ করা হয়, এমনকি যখন এই ভেরিয়েবলগুলি সংজ্ঞায়িত করা হয় set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION clang) set(CMAKE_ANDROID_STL_TYPE c++_static)। আমার জন্য একমাত্র কার্যকর উপায় ছিল ক্লাসিকset (CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
অ্যান্টোনিও

2
ম্যাকোসে আমার জন্য কাজ করে না (সিএমকেক ৩.৯.৪, হোমব্রে-ক্ল্যাং) হতাশা অন্যদের সংরক্ষণ। নিশ্চিত না কেন এটি @ ইভানমোরানের জন্য কাজ করে তবে আমার জন্য নয়।
আনপিডের

2
@ ইউনপিডের: এটি একটি সিএমকে বাগ আছে তবে আপনি এটির চারপাশে কাজ করতে পারেন, gitlab.kitware.com/cmake/cmake/issues/15943 দেখুন
ডেভিড গ্রেসন

186

সিএমকে কমান্ডটি target_compile_features()প্রয়োজনীয় সি ++ বৈশিষ্ট্য নির্দিষ্ট করতে ব্যবহৃত হয় cxx_range_for। সিএমকে তারপরে সি ++ মান ব্যবহার করাতে প্ররোচিত করবে।

cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
project(foobar CXX)
add_executable(foobar main.cc)
target_compile_features(foobar PRIVATE cxx_range_for)

add_definitions(-std=c++11)সিএমকে ভেরিয়েবলটি ব্যবহার বা সংশোধন করার দরকার নেইCMAKE_CXX_FLAGS , কারণ সিএমকে নিশ্চিত করবে যে সি ++ কম্পাইলারটি উপযুক্ত কমান্ড লাইন পতাকা সহ প্রেরণ করা হয়েছে।

হতে পারে আপনার সি ++ প্রোগ্রামের তুলনায় অন্যান্য সি ++ বৈশিষ্ট্য ব্যবহার করে cxx_range_for। সিএমকে বিশ্বব্যাপী সম্পত্তিCMAKE_CXX_KNOWN_FEATURES আপনি পছন্দ করতে পারেন এমন সি ++ বৈশিষ্ট্যগুলি তালিকাভুক্ত করে।

ব্যবহারের পরিবর্তে target_compile_features()আপনি সিএমকে বৈশিষ্ট্যগুলি সেট করে CXX_STANDARD এবং স্পষ্টভাবে সি ++ স্ট্যান্ডার্ড নির্দিষ্ট করতে পারেন CXX_STANDARD_REQUIRED আপনার সিএমকে লক্ষ্য ।

আরও দেখুন আমার আরো বিস্তারিত উত্তর


4
আজকের সম্পাদনাটি বিভ্রান্তিকর বলে মনে হচ্ছে। সিএমকে ৩.০.০ এ টার্গেট_কম্পাইল_সামগ্রী নেই। আমি ভুল হলে শুধরে. আমি মনে করি কমান্ডটি কেবলমাত্র সিএমকেটের রাতের বিল্ডগুলিতে উপস্থিত রয়েছে।
এরিক সিজলুন্ড

4
আমি বলব এটি সর্বাধিক সঠিক উত্তর
মাইচা ওয়ালেনসিয়াক

8
আমি মনে করি এটি এইভাবে করার কথা। অন্যান্য উত্তরগুলি কেবল ম্যানুয়ালি পতাকা যুক্ত করে এবং অতএব অসঙ্গতিগুলি প্রবর্তন করে। তবে এটি কেবল সিএমকে ৩.১++ উপলভ্য বলে মনে হচ্ছে
উলি

2
@ UliKöhler আসলে এই তবুও না পাওয়া যায়, এবং সম্ভবত হতে পারে জন্য চালু কিছু কম্পাইলার 3.2 হবে। স্বল্প মেয়াদে এই পদ্ধতিটি ব্যবহার করবেন না; এটি সম্পূর্ণরূপে বহনযোগ্য নয়।
ডগ

2
সিএমকে ২.6 এ কীভাবে করবেন তা সম্পর্কে কোনও ধারণা?
নুজোলিলো

93

আমি ব্যাবহার করছি

include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
elseif(COMPILER_SUPPORTS_CXX0X)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
else()
        message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif()

কিন্তু আপনি সাথে খেলতে চান তাহলে C++11, g++ 4.6.1চমত্কার পুরানো। আরও নতুন g++সংস্করণ পাওয়ার চেষ্টা করুন ।


4
এটিই আমার কাছে, এই প্রশ্নের একমাত্র সঠিক এবং সুন্দর উত্তর, সবচেয়ে সাম্প্রতিক লিনাক্সের জি ++ ব্যবহার করে বর্তমান (ঘূর্ণিত) করা হয়েছে।
প্যাট্রিক বি।

1
এটি অনুলিপি করে আটকানো হয়েছে এবং এটি পুরোপুরি কার্যকর হয়েছে। আমি সাইগউইনে CMAKE 2.8.9 ব্যবহার করছি। আমি এখানে পড়ছি বেশিরভাগ পদ্ধতির সম্পর্কে আমি জানি কারণ আমি CMAKE মেলিং তালিকাটি অনুসরণ করি এবং আমি ওয়েবকিটকে বিভিন্ন সংকলককে পোর্ট করেছি। ওয়েবকিট বন্দরগুলির জন্য আমরা যা করেছি তা হ'ল সিএমকে ২.৮.১২ ইনস্টল করা। তবে যেহেতু আমি জানি সাইগউইনের সিএমএকেই পুরানো, আমি সেই সংস্করণে প্রযোজ্য এমন কিছু চাইছিলাম। (
সাইগউইনের

দুর্দান্ত, এটি পুরানো সিএমকে এবং জি ++ 4.6 (এবং ভবিষ্যত-প্রমাণ) এর জন্য একটি ড্রপ-ইন। আমি CXX_STANDARDভিত্তিক উত্তরগুলিও উজ্জীবিত করেছি , তবে এটিই ছিল আমার পরিস্থিতিতে কার্যকর উত্তর।
টমাসজ গেন্ডার

এটি হ'ল আমি যা খুঁজছিলাম, তবে এটি মডিউলটি ব্যবহার করার জন্য ন্যূনতম cmake সংস্করণ কী তা পরিষ্কার নয়। cmake --help-মডিউলটি এ সম্পর্কে খুব বেশি সহায়তা করে না।
জান সেগ্রে

1
@ জনসেগ্রে মডিউলটি প্রথম দেখা গেল ২.৪, cmake.org/…
কোকুরতুর

57

সিএক্সএক্স স্ট্যান্ডার্ড সেট করার সবচেয়ে সহজ উপায় হ'ল:

 set_property(TARGET tgt PROPERTY CXX_STANDARD 11)

দেখুন CMake ডকুমেন্টেশন আরো বিস্তারিত জানার জন্য।


2
হ্যাঁ, এটি অবশ্যই আধুনিক সিএমকে (1.১++) করার সেরা উপায়গুলির মতো মনে হচ্ছে
এরবুর্থ বলেছেন মাইনিকা

14
বা আপনি কেবল set(CMAKE_CXX_STANDARD 11)তার পরে তৈরি সমস্ত টার্গেটের জন্য ডিফল্ট সম্পত্তি নির্ধারণ করতে পারেন ।
Emlai

1
আপনি যদি বিভিন্ন লক্ষ্যে বিভিন্ন সি ++ মান নির্ধারণ করতে চান তবে এটি আপনার সমাধানও প্রয়োজন, কারণ set@ এমলাইয়ের প্রস্তাবিত আদেশটি বিশ্বব্যাপী এবং পরবর্তী সমস্ত লক্ষ্যগুলি প্রভাবিত করে।
এলিয়ট স্লটার 21

40

দেখা যাচ্ছে SET(CMAKE_CXX_FLAGS "-std=c++0x")যেগুলি অনেকগুলি সি ++ 11 বৈশিষ্ট্য সক্রিয় করে। এটি কাজ না করার কারণটি ছিল যে বিবৃতিটি এরকম দেখাচ্ছে:

set(CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS} -g -ftest-coverage -fprofile-arcs")

এই পদ্ধতির অনুসরণ করে কোনওভাবে -std=c++0xপতাকা ওভাররাইট করা হয়েছিল এবং এটি কার্যকর হয়নি। একের পর এক পতাকা নির্ধারণ বা একটি তালিকা পদ্ধতি ব্যবহার করে কাজ চলছে।

list( APPEND CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS} -g -ftest-coverage -fprofile-arcs")

36
আমি সর্বদা স্রেফ ব্যবহার করি: SET (CMAKE_CXX_FLAGS "$ {CMAKE_CXX_FLAGS} -std = c ++ 11") # gcc> = 4.7 এর জন্য, বা 4.6 এর জন্য সি ++ 0x
ডেভিড ডোরিয়া

আমি একবার এর জন্য একটি ছোট স্ক্রিপ্ট করেছি (যদিও সম্পূর্ণ নয়): github.com/Morwenn/POLDER/blob/master/cmake/set_cxx_norm.cmake
Morwenn

9
-1। আপনি যদি কমান্ড লাইন থেকে কোনও CMAKE_CXX_FLAGS নির্দিষ্ট করে থাকেন তবে দ্বিতীয় পদ্ধতিটি বিল্ড কমান্ডে একটি সেমিকোলন তৈরি করবে (এবং আসল CMAKE_CXX_FLAGS দুবার পুনর্বার করবে)।
নিকোলাই

ম্যানুয়ালি -g পতাকা যুক্ত করার পরিবর্তে আপনার CMAKE_BUILD_TYPE ভেরিয়েবলটি ডিবাগ-এ সেট করা উচিত: ভয়েসস.ক্যানোনিকাল
জাসি.পাক্কেনেন

1
CXX_STANDARDযেমন কম্পাইলার অ্যাগনোস্টিক হয় সম্পত্তি উত্তম।
jaskmar

23

সহজতম পথ:

add_compile_options(-std=c++11)


5
কেবল সিএমকে ৩.০ থেকে উপলব্ধ
রাউল সালিনাস-

4
একই প্রকল্পে সি ফাইলগুলি সংকলন করার সময় এটি সতর্কতা এবং ত্রুটি সৃষ্টি করে।
গোলাপ

19

সিএমকে ৩.৮ এর জন্য এবং আরও নতুন আপনি ব্যবহার করতে পারেন

target_compile_features(target PUBLIC cxx_std_11)

1
সিএমকে-র সর্বশেষ সংস্করণটি এইভাবেই প্রস্তাবিত
ক্যামিনো

PUBLICএখানে কাজ কি ?
Rotsiser Mho

2
@ রোটসিরমো PUBLICঅর্থ হ'ল আপনার টার্গেটের উপর নির্ভর করে এমন অন্যান্য টার্গেটগুলিও সি ++ 11 ব্যবহার করবে। উদাহরণস্বরূপ যদি আপনার টার্গেটটি একটি লাইব্রেরি হয় তবে আপনার লাইব্রেরির সাথে লিঙ্কযুক্ত সমস্ত লক্ষ্যগুলি target_link_librariesসি ++ 11 সমর্থন দিয়ে সংকলিত হবে।
আইল্যাশ

17

এটি সি ++ 11 সমর্থন সক্ষম করার অন্য একটি উপায়,

ADD_DEFINITIONS(
    -std=c++11 # Or -std=c++0x
    # Other flags
)

আমি উদাহরণ পেয়েছি যেখানে কেবলমাত্র এই পদ্ধতিটি কাজ করে এবং অন্যান্য পদ্ধতি ব্যর্থ হয় methods সিএমকের সর্বশেষতম সংস্করণটির সাথে এটির কিছু থাকতে পারে।


9
এটি কেবলমাত্র তখনই কাজ করবে যদি আপনি কেবল সি ++ সংকলক ব্যবহার করেন। আপনি যদি সিসি সংকলকটি ব্যবহার করেন তবে এটি ব্যর্থ হবে।
এমমানুয়েল

5
add_definitionsকেবলমাত্র সংজ্ঞা যুক্ত করার জন্য ব্যবহৃত হয়, অর্থাত্- কিছু কিছু- এবং @ এমমানুয়েল যেমন বলেছেন, এটি অনেক ক্ষেত্রে কার্যকর হয় না।
xuhdev

আমি এটি আগে ব্যবহার করেছি তবে যখন আমি একটি সি ফাইল অন্তর্ভুক্ত করেছি তখন সমস্যা ছিল কারণ add_definitionsপতাকা স্থাপনের জন্য তৈরি করা হয়নি।
জান সেগ্রে

17

আধুনিক সিএমকেতে (> = 3.1) বৈশ্বিক প্রয়োজনীয়তা সেট করার সর্বোত্তম উপায় হ'ল:

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

এটি অনুবাদ করে "আমি সমস্ত টার্গেটের জন্য সি ++ 11 চাই, এটি alচ্ছিক নয়, আমি কোনও জিএনইউ বা মাইক্রোসফ্ট এক্সটেনশন ব্যবহার করতে চাই না।" সি ++ 17 হিসাবে, এটি এখনও সেরা উপায় আইএমএইচও।

উত্স: সি ++ 11 এবং পরে সিএমকে সক্ষম করা হচ্ছে


1
আপনার কাছে সর্বশেষতম সিএমকে না থাকলে এই উপায়টি সি ++ এর সর্বশেষতম সংস্করণগুলির জন্য আদর্শ নয়। যেমন আপনি সিএমকে ৩.১২ অবধি সি ++ 2 এ সক্ষম করতে পারবেন না।
রুসলান

6

আমার জন্য যা কাজ করে তা হ'ল আপনার সিএমকেলিস্ট.টেক্সটে নিম্নলিখিত লাইনটি সেট করা:

set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

এই কমান্ডটি সেট করা কম্পাইলারের জন্য সি ++ 11 বৈশিষ্ট্যগুলি সক্রিয় করে এবং cmake ..কমান্ডটি কার্যকর করার পরে , range based for loopsআপনার কোডটি ব্যবহার করতে এবং কোনও ত্রুটি ছাড়াই এটি সঙ্কলন করতে সক্ষম হওয়া উচিত ।


এই শেষ সর্বোত্তম উত্তর আপনি ঠিক করতে চান তাহলে -std=c++11, যেমন set (CMAKE_CXX_STANDARD 11)পতাকা ব্যবহার করবে -std=gnu++11, যা অবাঞ্ছিত হতে পারে।
আন্তোনিও

1
@ set (CMAKE_CXX_EXTENSIONS OFF)
অ্যান্টোনিও

3

আমি মনে করি কেবল এই দুটি লাইনই যথেষ্ট।

set(CMAKE_CXX_STANDARD 11)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

1
যখন কোনও প্রকল্পের সমস্ত লক্ষ্যগুলি একই সি ++ স্ট্যান্ডার্ড ব্যবহার করে তখন তা বোঝা যায় (উদাহরণস্বরূপ সমস্ত সংকলিত গ্রন্থাগার এবং এক্সিকিউটেবল সি ++ 11 ব্যবহার করে)। অন্যথায়, অন্যান্য উত্তরে target_compile_featuresযেমন দেখানো হয়েছে প্রতিটি স্বতন্ত্র টার্গেটের জন্য প্রয়োগ করা কমাক ফাংশন হ'ল আরও প্রস্তাবিত পদ্ধতি।
অ্যালান

3

আপনি যদি সর্বদা সর্বশেষ সি ++ স্ট্যান্ডার্ডটি সক্রিয় করতে চান তবে সাম্প্রতিককালের (সিএমকেক 3.8 এবং সিএমকে 3.11) সিএমএকেE_CXXGPANDARD এর 17 এবং 20 এর সংযোজনগুলির আলোকে আমার ডেভিড গ্রেসনের জবাবটি এখানে বাড়ানো হয়েছে :

IF (CMAKE_VERSION VERSION_LESS "3.8")
    SET(CMAKE_CXX_STANDARD 14)
ELSEIF (CMAKE_VERSION VERSION_LESS "3.11")
    SET(CMAKE_CXX_STANDARD 17)
ELSE()
    SET(CMAKE_CXX_STANDARD 20)
ENDIF()

# Typically, you'll also want to turn off compiler-specific extensions:
SET(CMAKE_CXX_EXTENSIONS OFF)

( set (CMAKE_CXX_STANDARD 11)লিঙ্কযুক্ত উত্তরের জায়গায় সেই কোডটি ব্যবহার করুন ))


1

আধুনিক cmake সি ++ এর একটি নির্দিষ্ট সংস্করণ ব্যবহারের জন্য সংকলকগুলিকে কনফিগার করার সহজ উপায় সরবরাহ করে। যে কাউকেই করতে হবে কেবলমাত্র তা প্রাসঙ্গিক লক্ষ্য বৈশিষ্ট্য সেট করা। সিএমকে সমর্থিত বৈশিষ্ট্যগুলির মধ্যে , সি ++ এর একটি নির্দিষ্ট সংস্করণ সমর্থন করার জন্য সংকলকগুলিকে কীভাবে কনফিগার করতে হয় তা নির্ধারণ করতে ব্যবহার করা হয়:

  • CXX_STANDARDসি ++ স্ট্যান্ডার্ড সেট করে যার বৈশিষ্ট্যগুলি লক্ষ্য তৈরির জন্য অনুরোধ করা হয়েছে। 11সি ++ 11 লক্ষ্য হিসাবে সেট করুন ।

  • CXX_EXTENSIONS, একটি বুলিয়ান যা নির্দিষ্ট করে সংকলক নির্দিষ্ট এক্সটেনশনগুলির জন্য অনুরোধ করা হয়েছে spec এটিকে সেট করা Offকোনও সংকলক-নির্দিষ্ট এক্সটেনশনের সমর্থনকে অক্ষম করে।

প্রদর্শনের জন্য, এখানে একটি এর নূন্যতম কার্যকারী উদাহরণ CMakeLists.txt

cmake_minimum_required(VERSION 3.1)

project(testproject LANGUAGES CXX )

set(testproject_SOURCES
    main.c++
    )

add_executable(testproject ${testproject_SOURCES})

set_target_properties(testproject
    PROPERTIES
    CXX_STANDARD 11
    CXX_EXTENSIONS off
    )

-5

ওএস এক্স এবং হোমব্রিউ এলএলভিএম সম্পর্কিত:

Cmake_minimum_required (সংস্করণ 3.3) এবং প্রকল্প () এর পরে কল করতে ভুলবেন না!

অথবা সিএমকে project()লাইন 1 এর আগে স্পষ্টভাবে sertোকানো হবে , ক্ল্যাং সংস্করণ সনাক্তকরণ এবং সম্ভবত অন্যান্য ধরণের সমস্যায় সমস্যা সৃষ্টি করবে। এখানে একটি সম্পর্কিত সমস্যা


2
প্রশ্নটি ওএসএক্স বা এলভিভিএম সম্পর্কিত নয়, বিশেষত। এছাড়াও, সি ++ 11 বিকাশের জন্য সিএমকে ভি 3.x প্রয়োজন হবে না। ঝনঝন সংস্করণ সনাক্তকরণ হিসাবে - এটি ওপি সম্পর্কে জিজ্ঞাসা করে না।
einpoklum
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.