Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法将uu cplusplus设置为C++;17标准配置Visual Studio和CMake_C++_Visual Studio_Cmake_C++17_Visual Studio 2019 - Fatal编程技术网

C++ 无法将uu cplusplus设置为C++;17标准配置Visual Studio和CMake

C++ 无法将uu cplusplus设置为C++;17标准配置Visual Studio和CMake,c++,visual-studio,cmake,c++17,visual-studio-2019,C++,Visual Studio,Cmake,C++17,Visual Studio 2019,我有一个CMake项目,它是在Visual Studio 2019中启动的。我的代码需要c++17功能,因此我在CMakeLists.txt cmake_minimum_required (VERSION 3.10.0) project (datalog) message (STATUS "Building project ${PROJECT_NAME}") find_package(stxxl CONFIG REQUIRED) include_directories (${CMAKE_

我有一个CMake项目,它是在Visual Studio 2019中启动的。我的代码需要c++17功能,因此我在
CMakeLists.txt

cmake_minimum_required (VERSION 3.10.0)

project (datalog)

message (STATUS "Building project ${PROJECT_NAME}")

find_package(stxxl CONFIG REQUIRED)

include_directories (${CMAKE_SOURCE_DIR}/src)

set (PROJECT_SRC
  main.cpp
  )

add_executable (${PROJECT_NAME} ${PROJECT_SRC})
target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17)

target_link_libraries(${PROJECT_NAME} stxxl)
if(MSVC)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++17 /Zc:__cplusplus")
endif()
当我构建时,我得到了很多错误,因为我正在链接的库,
stxxl
,与
vcpkg
一起安装,具有以下代码段:

STXXL_BEGIN_NAMESPACE

template <class Type>
struct compat_unique_ptr {
#if __cplusplus >= 201103L && ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100) >= 40400)
    typedef std::unique_ptr<Type> result;
#else
    // auto_ptr is inherently broken and is deprecated by unique_ptr in c++0x
    typedef std::auto_ptr<Type> result;
#endif
};

STXXL_END_NAMESPACE
但一切都没有改变。我还使用了一些C++17的特性,所以目前还不能回头

我可以手动更新
stxxl
头文件来删除宏,但这是一种解决方法,每个开发人员都应该创建相同的修复程序。相反,我想知道为什么会出现错误,以及如何使用Visual Studio和CMake将宏设置为正确的值。你有什么建议吗?

我想你需要的是,你可以在CMake中定义任意宏并将其传递给编译器。

据我所知,你需要手动添加
/Zc:\u cplusplus
(至少现在是这样)

你的CMakeList代码片段对我有用,你确定
\uuuuCplusPlus
设置不正确,而且不只是
\uuuuuGnuc\uuuCplusPlus
宏丢失了吗

也就是说,我建议测试VisualStudio的版本是否足够新:

# /Zc:__cplusplus is required to make __cplusplus accurate
# /Zc:__cplusplus is available starting with Visual Studio 2017 version 15.7
# (according to https://docs.microsoft.com/en-us/cpp/build/reference/zc-cplusplus)
# That version is equivalent to _MSC_VER==1914
# (according to https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=vs-2019)
# CMake's ${MSVC_VERSION} is equivalent to _MSC_VER
# (according to https://cmake.org/cmake/help/latest/variable/MSVC_VERSION.html#variable:MSVC_VERSION)
if ((MSVC) AND (MSVC_VERSION GREATER_EQUAL 1914))
    target_compile_options(stxxl INTERFACE "/Zc:__cplusplus")
endif()
注意:我曾经向库目标的接口添加必要的选项。这样,依赖于该库(通过target_link_库)的所有目标都将使用该标志进行编译,但不需要该标志(可能与该标志不兼容)的目标将无法获得该标志

如果要将标志添加到您自己的目标之一,可以使用
target\u compile\u选项(stxxl PUBLIC)/Zc:\u cplusplus”)
PUBLIC
而不是
接口
)<代码>接口表示当其他目标依赖于该目标时使用该选项,
专用
表示该选项用于目标本身,
公用
表示两者。(伊姆霍解释得很好。)


除此之外,您不应该通过编译标志设置C++标准版本,而是使用需要更新版本的版本,使用
如果您只想使用更新版本(如果有)

在您的情况下,后者可能足够,因为如果C++版本更大,则CODESPEPET有后退。



如果更改stxxl的代码(通过pull请求等)是一个选项,则该代码可以测试和修改。这样,它就可以在不需要
/Zc:u cplusplus

的情况下工作。Visual Studio不支持所有C++17功能。请看@JesperJuhl,我做到了,我试着像那篇文章中写的那样设置
/Zc
标志,正如我在帖子中所说的,但没有任何改变。也许我需要以另一种方式设置可视开关?请注意,无论如何,您都必须破解标题,因为即使您让MSVC设置正确的
\uuuuuCPlusplus
,您也不太可能将其设置为
\uuGnuc\uuuCPlusplus
。是的,我注意到了这一点,我正在vcpkg存储库中创建一个pull请求,但
\uuCPlusplus
问题仍然存在,这是一个普遍的问题,与图书馆没有严格的关系。