C++ 无法将uu cplusplus设置为C++;17标准配置Visual Studio和CMake
我有一个CMake项目,它是在Visual Studio 2019中启动的。我的代码需要c++17功能,因此我在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_
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
问题仍然存在,这是一个普遍的问题,与图书馆没有严格的关系。