【发布时间】:2019-11-27 20:14:49
【问题描述】:
我有一个使用 Visual Studio 2019 打开的 CMake 项目。我的代码需要 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)
构建时出现很多错误,因为我链接的库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
问题在于__cplusplus 的值是199711L,而不是正确的值201703L,因此代码尝试使用在C++17 标准中删除的auto_ptr。
我也尝试在 Visual Studio 中手动设置标志,将此部分添加到 CmakeLists.txt
if(MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++17 /Zc:__cplusplus")
endif()
但没有任何改变。我还使用了一些 C++17 特性,所以现在不能返回。
我可以手动更新stxxl 头文件以摆脱宏,但这是一种解决方法,每个开发人员都应该创建相同的修复程序。相反,我想知道为什么会出现错误以及如何使用 Visual Studio 和 CMake 将宏设置为正确的值。你有什么建议吗?
【问题讨论】:
-
Visual Studio 不支持所有 C++17 功能。 docs.microsoft.com/en-us/cpp/overview/…
-
@JesperJuhl 我做到了,我已经尝试设置
/Zc标志,正如我在帖子中所说的那样,但没有任何改变。也许我需要以另一种方式设置视觉开关? -
请注意,无论如何您都必须破解标头,因为即使您让 MSVC 设置正确的
__cplusplus,您也不太可能将其设置为__GNUC__。 -
是的,我已经注意到了,我正在 vcpkg 存储库中创建一个拉取请求,但
__cplusplus问题仍然存在,这是一个普遍问题,与库没有严格关系。
标签: c++ visual-studio cmake c++17 visual-studio-2019