swe*_*rtz 6 c++ gcc cmake c++11 c++14
我在为使用 CMake 构建的项目设置 C++ 标准时遇到一些问题。该代码大量使用了 C++11 功能,所以到目前为止我正在做:
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
Run Code Online (Sandbox Code Playgroud)
现在,由于最近的 GCC 版本默认使用 C++14,我最终不得不按照公共要求链接使用 C++14 构建的库,并且在尝试严格使用 C++11 构建时会发生冲突。
因此,目标是至少需要C++11 标准,但如果较新,则使用默认编译器版本。
我尝试过
target_compile_features(myLib PUBLIC cxx_std_11)
Run Code Online (Sandbox Code Playgroud)
但 CMake 最终添加了该-std=c++11标志,这很令人困惑,因为文档明确指出
CMake 将确保以支持 C++ 11(或更高版本)的模式调用编译器,如有必要,添加 -std=gnu++11 等标志
我也尝试过使用CMAKE_CXX_STANDARD_COMPUTED_DEFAULT内部变量,但这很麻烦,因为"98"大于"11"。
当然可以使用该变量或使用该check_cxx_compiler_flag()函数来使其工作,并测试不同的情况,但我希望在每三年出现新标准的时代有一种更简单的方法来实现这一目标。 。
我知道这是一个老问题,但无论如何:您走在正确的道路上,只需用于target_compile_features您在 CMakeLists 项目中声明的库即可。如果您使用相同的 GCC 版本,则将 c++14 库与 c++11 库链接应该没有问题(在每个库上放置什么 -std=... 并不重要)。
所以,如果你有 libA、libB 和 libC,你可以这样做:
target_compile_features(libA PUBLIC cxx_std_11)
target_compile_features(libB PUBLIC cxx_std_14)
target_compile_features(libC PUBLIC cxx_std_17)
Run Code Online (Sandbox Code Playgroud)
如果由于某种原因编译器版本需要不同,那么我想如果您可以构建共享库而不是静态库,您应该能够链接它们。
关于 cxx 扩展和标准的进一步说明:如果想要避免扩展(即使用 c++11 而不是 gnu++11 进行编译),可以将 CMAKE_CXX_EXTENSIONS 设置为 OFF
set(CMAKE_CXX_EXTENSIONS OFF)
Run Code Online (Sandbox Code Playgroud)
默认行为是启用 CXX 扩展。您需要在创建目标之前设置此项。
不允许扩展的简单示例:
cmake_minimum_required(VERSION 3.16)
project(test-poc)
set(CMAKE_CXX_EXTENSIONS OFF)
add_executable(main main.cpp)
target_compile_features(main PRIVATE cxx_std_17)
Run Code Online (Sandbox Code Playgroud)
我们在创建目标之前添加 CMAKE_CXX_EXTENSIONS OFF,因此 CMake 将选择 -std=c++17 而不是 -std=gnu++17。如果我们删除该行,CMake 将选择 -std=gnu++17
请参阅: https: //cmake.org/cmake/help/latest/prop_tgt/CXX_EXTENSIONS.html#prop_tgt :CXX_EXTENSIONS
| 归档时间: |
|
| 查看次数: |
1324 次 |
| 最近记录: |