在发布此问题之前,我已经阅读了许多在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()