Ketika saya mencoba menjalankan makefile CMake yang dihasilkan untuk mengkompilasi program saya, saya mendapatkan kesalahan itu
rentang berbasis loop tidak didukung dalam mode C ++ 98.
Saya mencoba menambahkan add_definitions(-std=c++0x)
ke saya CMakeLists.txt
, tetapi tidak membantu.
Saya mencoba ini juga:
if(CMAKE_COMPILER_IS_GNUCXX)
add_definitions(-std=gnu++0x)
endif()
Ketika saya melakukannya g++ --version
, saya mendapatkan:
g ++ (Ubuntu / Linaro 4.6.1-9ubuntu3) 4.6.1
Saya juga sudah mencoba SET(CMAKE_CXX_FLAGS "-std=c++0x")
, yang juga tidak berhasil.
Saya tidak mengerti bagaimana saya bisa mengaktifkan fitur C ++ 11 menggunakan CMake.
SET(CMAKE_CXX_FLAGS "-std=c++0x")
bekerja dengan baik bagi saya, jadi mungkin ada masalah di tempat lain dalam file CMakeLists. Pastikan Anda tidak sengaja menimpa konten CMAKE_CXX_FLAGS nanti.set(CMAKE_CXX_STANDARD 11)
(sebelum mendefinisikan target) adalah cara terbaik.CXX_STANDARD
itu tidak bekerja pada MSVC, jadi pada dasarnya Anda harus kembali ketarget_compile_features
jika Anda menginginkan sesuatu yang bekerja lintas-platform.Jawaban:
CMake 3.1 memperkenalkan variabel CMAKE_CXX_STANDARD yang dapat Anda gunakan. Jika Anda tahu bahwa Anda akan selalu memiliki CMake 3.1, Anda bisa menulis ini di file CMakeLists.txt tingkat atas Anda, atau letakkan tepat sebelum target baru didefinisikan:
Jika Anda perlu mendukung versi CMake yang lebih lama, ini adalah makro yang saya buat yang dapat Anda gunakan:
Makro hanya mendukung GCC sekarang, tetapi harus lurus ke depan untuk memperluasnya ke kompiler lain.
Kemudian Anda bisa menulis
use_cxx11()
di bagian atas file CMakeLists.txt apa pun yang mendefinisikan target yang menggunakan C ++ 11.Masalah CMake # 15943 untuk pengguna berdentang yang menargetkan macOS
Jika Anda menggunakan CMake dan dentang untuk menargetkan macOS ada bug yang dapat menyebabkan
CMAKE_CXX_STANDARD
fitur tidak berfungsi (tidak menambahkan flag kompiler). Pastikan Anda melakukan salah satu dari hal-hal berikut:Setel kebijakan CMP0025 ke BARU dengan kode berikut di bagian atas file CMakeLists.txt Anda sebelum
project
perintah:sumber
gnu++11
ditegakkan, bahkan ketika variabel-variabel ini didefinisikanset(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION clang)
set(CMAKE_ANDROID_STL_TYPE c++_static)
. Bagi saya satu-satunya cara yang layak adalah klasikset (CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
Perintah CMake
target_compile_features()
digunakan untuk menentukan fitur C ++ yang diperlukancxx_range_for
. CMake kemudian akan menginduksi standar C ++ untuk digunakan.Tidak perlu menggunakan
add_definitions(-std=c++11)
atau memodifikasi variabel CMakeCMAKE_CXX_FLAGS
, karena CMake akan memastikan kompiler C ++ dipanggil dengan flag baris perintah yang sesuai.Mungkin program C ++ Anda menggunakan fitur C ++ lainnya
cxx_range_for
. Properti global CMakeCMAKE_CXX_KNOWN_FEATURES
mencantumkan fitur C ++ yang dapat Anda pilih.Alih-alih menggunakan
target_compile_features()
Anda juga dapat menentukan standar C ++ secara eksplisit dengan mengatur properti CMakeCXX_STANDARD
danCXX_STANDARD_REQUIRED
untuk target CMake Anda.Lihat juga jawaban saya yang lebih terperinci .
sumber
saya menggunakan
Tetapi jika Anda ingin bermain dengan
C++11
,g++ 4.6.1
sudah cukup tua. Cobalah untuk mendapatkang++
versi yang lebih baru .sumber
CXX_STANDARD
jawaban berbasiskan, tetapi ini adalah satu-satunya jawaban yang berguna dalam situasi saya.Cara termudah untuk menetapkan standar Cxx adalah:
Lihat dokumentasi CMake untuk lebih jelasnya.
sumber
set(CMAKE_CXX_STANDARD 11)
mendefinisikan properti default untuk semua target yang dibuat setelah itu.set
perintah yang disarankan oleh @emlai bersifat global dan memengaruhi semua target selanjutnya.Ternyata,
SET(CMAKE_CXX_FLAGS "-std=c++0x")
memang mengaktifkan banyak fitur C ++ 11. Alasan itu tidak berhasil adalah pernyataan itu terlihat seperti ini:Mengikuti pendekatan ini, entah bagaimana
-std=c++0x
bendera itu ditimpa dan itu tidak berfungsi. Mengatur bendera satu per satu atau menggunakan metode daftar berfungsi.sumber
CXX_STANDARD
properti lebih baik karena compiler-agnostik.Cara termudah:
add_compile_options(-std=c++11)
sumber
Untuk CMake 3.8 dan yang lebih baru dapat Anda gunakan
sumber
PUBLIC
sini?PUBLIC
berarti bahwa target lain yang bergantung pada target Anda akan menggunakan C ++ 11 juga. Misalnya jika target Anda adalah pustaka, maka semua target yang terhubung dengan pustaka Andatarget_link_libraries
akan dikompilasi dengan dukungan C ++ 11.Ini adalah cara lain untuk mengaktifkan dukungan C ++ 11,
Saya telah menemukan contoh di mana hanya metode ini bekerja dan metode lain gagal. Mungkin ada hubungannya dengan CMake versi terbaru.
sumber
add_definitions
seharusnya hanya digunakan untuk menambahkan DEFINISI, yaitu -D SESUATU. Dan seperti yang dikatakan @Emmanuel, itu tidak berfungsi dalam banyak kasus.add_definitions
tidak dibuat untuk mengatur bendera.Pada CMake modern (> = 3.1) cara terbaik untuk menetapkan persyaratan global adalah:
Ini diterjemahkan menjadi "Saya ingin C ++ 11 untuk semua target, ini bukan opsional, saya tidak ingin menggunakan ekstensi GNU atau Microsoft." Pada C ++ 17, ini masih IMHO cara terbaik.
Sumber: Mengaktifkan C ++ 11 Dan Selanjutnya Di CMake
sumber
Apa yang berhasil bagi saya adalah mengatur baris berikut di CMakeLists.txt Anda:
Mengatur perintah ini mengaktifkan fitur C ++ 11 untuk kompiler dan setelah menjalankan
cmake ..
perintah, Anda harus dapat menggunakanrange based for loops
kode Anda dan mengompilasinya tanpa kesalahan.sumber
-std=c++11
, sepertiset (CMAKE_CXX_STANDARD 11)
akan menggunakan bendera-std=gnu++11
, yang mungkin tidak diinginkan.set (CMAKE_CXX_EXTENSIONS OFF)
Saya pikir hanya dua baris ini sudah cukup.
sumber
target_compile_features
fungsi Cmake , diterapkan untuk setiap target individu, seperti yang ditunjukkan dalam jawaban lain, adalah pendekatan yang lebih direkomendasikan.Jika Anda ingin selalu mengaktifkan standar C ++ terbaru, berikut ini ekstensi saya dari jawaban David Grayson , mengingat penambahan baru-baru ini (CMake 3.8 dan CMake 3.11) dari nilai 17 dan 20 untuk CMAKE_CXX_STANDARD):
(Gunakan kode itu sebagai pengganti
set (CMAKE_CXX_STANDARD 11)
jawaban yang ditautkan.)sumber
Cmake modern menawarkan cara yang lebih sederhana untuk mengonfigurasi kompiler untuk menggunakan versi khusus C ++. Satu-satunya hal yang perlu dilakukan oleh siapa pun adalah mengatur properti target yang relevan. Di antara properti yang didukung oleh cmake , yang digunakan untuk menentukan cara mengonfigurasi kompiler untuk mendukung versi C ++ tertentu adalah sebagai berikut:
CXX_STANDARD
menetapkan standar C ++ yang fitur-fiturnya diminta untuk membangun target. Tetapkan ini sebagai11
untuk menargetkan C ++ 11.CXX_EXTENSIONS
, boolean yang menentukan apakah ekstensi spesifik kompiler diminta. Menetapkan ini sebagaiOff
menonaktifkan dukungan untuk ekstensi spesifik-kompiler.Untuk menunjukkan, berikut adalah contoh kerja minimal dari a
CMakeLists.txt
.sumber
Terkait OS X dan Homebrew LLVM:
Jangan lupa untuk memanggil cmake_minimum_required (VERSION 3.3) dan proyek () setelah itu!
Atau CMake akan memasukkan
project()
secara implisit sebelum baris 1, menyebabkan masalah dengan deteksi versi Dentang dan kemungkinan jenis masalah lainnya. Ini masalah terkait .sumber