如何在cmake项目中的Visual Studio Community 2019中启用C ++ 17编译?

时间:2019-09-09 09:54:58

标签: cmake c++17 visual-studio-2019

在发布此问题之前,我已经阅读了许多在StackOverflow上发布的线程。而且我仍然没有找到有效的答案。 我已经看到有些人的讽刺讯息是重复的,但事实并非如此。

我已检查https://cmake.org/cmake/help/latest/prop_tgt/CXX_STANDARD.html#prop_tgt:CXX_STANDARD 但是我想将其应用于MSVC的特殊情况,因为MSVC是一种特殊情况。

我在out文件夹中尝试过:     set_target_properties(myTarget属性         CXX_STANDARD 17         CXX_STANDARD_REQUIRED是         CXX_EXTENSIONS否     )

例如,我已阅读:

但是这些并不完全适用于我的问题。

实际上,我最近卸载了Visual Studio Community 2017,并且已经安装了Visual Studio Community 2019。

我想编译一个源于BartłomiejFilipek 的代码。

代码在下面。我用了CMake。在默认的CMake代码中,我添加了以下内容:

if (MSVC_VERSION GREATER_EQUAL "1900")
    include(CheckCXXCompilerFlag)
    CHECK_CXX_COMPILER_FLAG("/std:c++latest" _cpp_latest_flag_supported)
    if (_cpp_latest_flag_supported)
        add_compile_options("/std:c++latest")
    endif()
endif()

我有以下编译错误:

Erreur  C2039   'align_val_t' : not a member of 'std'   

因此,这意味着未考虑C ++ 17。

默认情况下,CMake文件的版本即CMake用以下方式表示:

cmake_minimum_required (VERSION 3.8)

但是在StackOverflow的某些页面上说,从CMake版本3.10开始考虑了该标志

但是,VSC 19提出了CMake 3.8

如果是最新版本,那是很奇怪的。

那么,请问我该如何解决呢?

#include <cstdint>
#include <iostream>
#include <malloc.h>
#include <cassert>
#include <vector>
#include <new>

void* operator new(std::size_t size, std::align_val_t align) {
//#ifdef _MSC_VER
#if defined(_WIN32) || defined(__CYGWIN__)
auto ptr = _aligned_malloc(size, static_cast<std::size_t>(align));
std::cout << "wind" << '\n';
#else
auto ptr = aligned_alloc(static_cast<std::size_t>(align), size);
#endif

if (!ptr)
    throw std::bad_alloc{};

std::cout << "new: " << size << ", align: "
    << static_cast<std::size_t>(align)
    << ", ptr: " << ptr << '\n';

return ptr;
}

void operator delete(void* ptr, std::size_t size, std::align_val_t align) 
{
std::cout << "avec size delete: " << size << ", align: "
    << static_cast<std::size_t>(align)
    << ", ptr : " << ptr << '\n';
//#ifdef _MSC_VER
#if defined(_WIN32) || defined(__CYGWIN__)
_aligned_free(ptr);
#else
free(ptr);
#endif
}

void operator delete(void* ptr, std::align_val_t align) {
std::cout << "delete: align: "
    << static_cast<std::size_t>(align)
    << ", ptr : " << ptr << '\n';
//#ifdef _MSC_VER
#if defined(_WIN32) || defined(__CYGWIN__)
_aligned_free(ptr);
#else
free(ptr);
#endif
}

//And here’s some test code:

class alignas(32) Vec3dAVX {
double x, y, z;
};

int main() {

std::cout << "std::vector\n";
std::vector<Vec3dAVX> vec;
vec.push_back({});
vec.push_back({});
vec.push_back({});
assert(reinterpret_cast<uintptr_t>(vec.data()) % alignof(Vec3dAVX) == 0);
}

CMake代码:

# CMakeList.txt : fichier projet CMake de niveau supérieur, effectuez une configuration globale
# et incluez les sous-projets ici.
#
cmake_minimum_required (VERSION 3.8)

project ("lameduck")

 #Incluez les sous-projets.
add_subdirectory ("lameduck")

if (MSVC_VERSION GREATER_EQUAL "1900")
    include(CheckCXXCompilerFlag)
    CHECK_CXX_COMPILER_FLAG("/std:c++latest" _cpp_latest_flag_supported)
    if (_cpp_latest_flag_supported)
        add_compile_options("/std:c++latest")
    endif()
endif()

0 个答案:

没有答案