使用CMake指定C++14编译出现cxx17相关符号原因问询
问题原因解答
核心结论
你观察到的现象是GCC标准库(libstdc++)的ABI命名规则与C编译标准解耦的正常表现,**你指定的C14标准已正确生效,二进制中出现的cxx17标记符号不代表使用了C++17标准编译**。
具体原因
- GCC 5及后续版本引入了多ABI兼容机制,libstdc的部分STL实现符号会携带
cxx11/cxx17标记,用于区分不同ABI版本的实现逻辑,该标记与编译时指定的C语言标准没有直接绑定关系。 - 你使用的Debian bullseye自带的GCC 10.2.1版本的libstdc++,在实现STL通用逻辑时,将部分跨C标准兼容的接口实现统一放到带
cxx17标记的符号下。哪怕你在C14模式下调用兼容的STL接口(比如示例代码中用到的std::vector相关方法),也会链接这些提前编译好的通用符号,最终导致二进制中出现cxx17相关标记。 __cplusplus宏的输出是C标准是否生效的最直接证据:201402是C14标准对应的固定宏值,完全符合你的配置预期。
配置正确性验证
你当前的CMake配置完全正确,以下配置项共同保证了C++14标准的强制生效:
cmake_minimum_required(VERSION 3.22) project(demo CXX) set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) add_executable(demo main.cpp) target_compile_features(demo PUBLIC cxx_std_14)
你可以执行以下命令二次验证编译参数确实携带-std=c++14:
make clean && make VERBOSE=1 | grep -E "std=c\+\+"
输出结果中可以明确看到编译时传递的C标准参数为c++14,无C17相关编译参数。
内容的提问来源于stack exchange,提问作者malat
相关产品推荐
相关产品推荐

