Nasıl cmake ile bir derleyici c 11 desteği tespit
Bir şekilde cmake eğer bir derleyici C 11 destekliyorsa veya otomatik olarak algılamasına izin verin.
Kod derleyici C 11 desteklemiyor gibi derleme değil cmake çalışması sırasında kullanıcıları bilgilendirmek için iyi olurdu. Eğer bir derleyici bunu destekliyor mu yoksa C 11 bayrakları ancak koyduğum anda kullanıcı cmake çalışması sırasında bir hata yerine hataları derleyin.
İşlevler sağlayan sınıf modülü gerekli bulamadım ancak mükemmel find_package()
gibi bir şey olurdu.
Ek eğer derleyici bayrakları std=c 0x
std=c 11
gerekiyorsa algılama özelliği olması güzel olurdu.
Bir şey vardır ya da kendi başıma geliştirmeye ihtiyacım var mıydı?
Burada bazı kod şimdiye kadar kullandığım, ancak GNU gcc derleyicileri ile çalışır. Eğer daha genel bir çözüm olsaydı güzel olurdu.
if(CMAKE_COMPILER_IS_GNUCXX)
execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
if (GCC_VERSION VERSION_GREATER 4.7 OR GCC_VERSION VERSION_EQUAL 4.7)
message(STATUS "C 11 activated.")
add_definitions("-std=gnu 11")
elseif(GCC_VERSION VERSION_GREATER 4.3 OR GCC_VERSION VERSION_EQUAL 4.3)
message(WARNING "C 0x activated. If you get any errors update to a compiler which fully supports C 11")
add_definitions("-std=gnu 0x")
else ()
message(FATAL_ERROR "C 11 needed. Therefore a gcc compiler with a version higher than 4.3 is needed.")
endif()
else(CMAKE_COMPILER_IS_GNUCXX)
add_definitions("-std=c 0x")
endif(CMAKE_COMPILER_IS_GNUCXX)
CEVAP
Eğer CMake sürümü 3.1.0 ya da geç C özellikleri ne algılayabilirsiniz C derleyici destekler
cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
project(foobar CXX)
message("Your C compiler supports these C features:")
foreach(i ${CMAKE_CXX_COMPILE_FEATURES})
message("${i}")
endforeach()
Ama normalde CMake değişken kullanmana gerek yokCMAKE_CXX_COMPİLE_FEATURESCMake komut. Altında C standart C dosyalarının derlenmesi CMake sana nasıl iki yolu vardır bunun yerine, her iki tarafından gerekli C belirterek açıkça veya C standart belirleme özellikleri ve CMake C standardı teşvik edelim. CMake C derleyici doğru komut satırı bayrakları (örneğin,- std=c 11) ile çağrılır emin olun.
1. C standardı açıkça belirterek
C standardı açıkça, CMake özelliklerini ayarlayarak belirtin CXX_STANDARD ve CMake hedef için CXX_STANDARD_REQUIRED.
$ cat /tmp/src/CMakeLists.txt
project(foobar CXX)
cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
add_executable(prog main.cc)
set_property(TARGET prog PROPERTY CXX_STANDARD 11)
set_property(TARGET prog PROPERTY CXX_STANDARD_REQUIRED ON)
$ cat /tmp/src/main.cc
int main() {
return 0;
}
$ mkdir /tmp/build
$ cd /tmp/build
$ cmake /tmp/src
-- The CXX compiler identification is GNU 4.8.2
-- Check for working CXX compiler: /usr/bin/c
-- Check for working CXX compiler: /usr/bin/c -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/build
$ make VERBOSE=1 | grep main.cc | grep -- "-c"
/usr/bin/c -std=gnu 11 -o CMakeFiles/prog.dir/main.cc.o -c /tmp/src/main.cc
$
2. Gerekli C belirtme özellikleri ve CMake C standardı teşvik edelim
CMake komutu target_compile_features kullanımı CMake hedef yapılan C özellikleri belirtmek için kullanabilirsiniz. Bu listeden CMake C standardı kullanılacak neden olacaktır. CMAKE_CXX_KNOWN_FEATURES C listeleri CMake genel özelliği seçebilirsiniz vardır.
cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
message("Your CMake version supports these C features:")
get_property(known_features GLOBAL PROPERTY CMAKE_CXX_KNOWN_FEATURES)
foreach(i ${known_features})
message("${i}")
endforeach()
Örneğin, bu C dosya adı ile bir programmain.ccyapar C 11 özellikleri kullanın: cxx_strong_enums,cxx_constexpr,cxx_auto_type
#include <cstdlib>
int main(int argc, char *argv[]) {
enum class Color { Red, Orange, Yellow, Green, Blue, Violet };
constexpr float a = 3.1415f;
auto b = a;
return EXIT_SUCCESS;
}
Bu CMakeLists.txt dosya oluşturmak istiyorsunuz
cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
project(foobar CXX)
add_executable(foobar main.cc)
set(needed_features
cxx_strong_enums
cxx_constexpr
cxx_auto_type)
target_compile_features(foobar PRIVATE ${needed_features})
Nasıl yok C# derleyici COM türünü tesp...
Nasıl bir tarayıcı VML veya SVG desteğ...
Cmake, nasıl olursa derleyici Çınlama ...
Nasıl eğer tarayıcı HTML5 Yerel Depola...
Nasıl JavaScript devre dışı olup olmad...