SORU
11 HAZİRAN 2012, PAZARTESİ


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
23 Kasım 2013, CUMARTESİ


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})

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • MarinaHD2001

    MarinaHD2001

    7 ŞUBAT 2009
  • The Warp Zone

    The Warp Zon

    24 AĞUSTOS 2007
  • UsherVEVO

    UsherVEVO

    15 EKİM 2009