如何将 C++14 标准要求从基于 POCO 的项目更改为 C++17
How to change C++14 standard requirement from POCO based project to C++17
我正在使用 Cmake 和 POCO 构建一个项目,我正在使用 vcpkg 来管理我在 ubuntu 中的依赖项所以一开始我的 cmake 文件是这样的
cmake_minimum_required(VERSION 3.8)
project(web)
set(CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Poco COMPONENTS Net Util PDF SQL XML REQUIRED)
add_executable(web "main.cpp")
target_link_libraries(web PRIVATE Poco::Net Poco::PDF Poco::SQL
Poco::XML)
但后来我发现这就是命令行发生的事情
/usr/bin/g++-7 -DPOCO_ENABLE_CPP14 -DPOCO_HAVE_FD_EPOLL -
DPOCO_STATIC -DPOCO_UNBUNDLED -D_DEBUG -D_FILE_OFFSET_BITS=64 -
D_LARGEFILE64_SOURCE -D_REENTRANT -D_THREAD_SAFE -
D_XOPEN_SOURCE=500 -isystem /home/pius/vcpkg/installed/x64-
linux/include -g -std=gnu++17 -std=gnu++14 -MD -MT
CMakeFiles/web.dir/main.cpp.o -MF CMakeFiles/web.dir/main.cpp.o.d -
o
尽你所能 POCO 正在添加一个新定义 -DPOCO_ENABLE_CPP14
并且它默认将 -std=gnu++14
传递给 gcc 因为我的代码依赖于 C++17 string_view 我想要 C+ +17,我试图将我的 CMake 文件编辑成这样
cmake_minimum_required(VERSION 3.8)
project(web)
find_package(Poco COMPONENTS Net Util PDF SQL XML REQUIRED)
add_executable(web "main.cpp")
set(CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_definitions(-std=gnu++17)
remove_definitions(-DPOCO_ENABLE_CPP14 -std=gnu++14)
target_link_libraries(web PRIVATE Poco::Net Poco::PDF Poco::SQL
Poco::XML)
但 Cmake 仍然产生与以前相同的效果,remove_definitions 命令不起作用,无论如何我可以覆盖 POCO 强加的默认要求并使用我自己的吗?谢谢
我终于找到了解决方案,事实证明我可能无法决定我的依赖关系但我可以决定我自己的项目
set_target_properties(web PROPERTIES CXX_STANDARD 17)
因为你需要 CMake 3.8
你应该改用:
target_compile_features(web PUBLIC cxx_std_17)
参考:
https://cmake.org/cmake/help/v3.8/manual/cmake-compile-features.7.html#requiring-language-standards
https://cmake.org/cmake/help/v3.8/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.html
我正在使用 Cmake 和 POCO 构建一个项目,我正在使用 vcpkg 来管理我在 ubuntu 中的依赖项所以一开始我的 cmake 文件是这样的
cmake_minimum_required(VERSION 3.8)
project(web)
set(CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Poco COMPONENTS Net Util PDF SQL XML REQUIRED)
add_executable(web "main.cpp")
target_link_libraries(web PRIVATE Poco::Net Poco::PDF Poco::SQL
Poco::XML)
但后来我发现这就是命令行发生的事情
/usr/bin/g++-7 -DPOCO_ENABLE_CPP14 -DPOCO_HAVE_FD_EPOLL -
DPOCO_STATIC -DPOCO_UNBUNDLED -D_DEBUG -D_FILE_OFFSET_BITS=64 -
D_LARGEFILE64_SOURCE -D_REENTRANT -D_THREAD_SAFE -
D_XOPEN_SOURCE=500 -isystem /home/pius/vcpkg/installed/x64-
linux/include -g -std=gnu++17 -std=gnu++14 -MD -MT
CMakeFiles/web.dir/main.cpp.o -MF CMakeFiles/web.dir/main.cpp.o.d -
o
尽你所能 POCO 正在添加一个新定义 -DPOCO_ENABLE_CPP14
并且它默认将 -std=gnu++14
传递给 gcc 因为我的代码依赖于 C++17 string_view 我想要 C+ +17,我试图将我的 CMake 文件编辑成这样
cmake_minimum_required(VERSION 3.8)
project(web)
find_package(Poco COMPONENTS Net Util PDF SQL XML REQUIRED)
add_executable(web "main.cpp")
set(CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_definitions(-std=gnu++17)
remove_definitions(-DPOCO_ENABLE_CPP14 -std=gnu++14)
target_link_libraries(web PRIVATE Poco::Net Poco::PDF Poco::SQL
Poco::XML)
但 Cmake 仍然产生与以前相同的效果,remove_definitions 命令不起作用,无论如何我可以覆盖 POCO 强加的默认要求并使用我自己的吗?谢谢
我终于找到了解决方案,事实证明我可能无法决定我的依赖关系但我可以决定我自己的项目
set_target_properties(web PROPERTIES CXX_STANDARD 17)
因为你需要 CMake 3.8
你应该改用:
target_compile_features(web PUBLIC cxx_std_17)
参考:
https://cmake.org/cmake/help/v3.8/manual/cmake-compile-features.7.html#requiring-language-standards
https://cmake.org/cmake/help/v3.8/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.html