You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake编译MySQL Connector-C++时std::shared_ptr检测失败求助

解决VS2017环境下CMake检测std::shared_ptr失败的问题

我太懂你这种困惑了——明明VS2017本身完全支持std::shared_ptr,日常写代码都没问题,但CMake的这段检查逻辑却报错说这个类型不可用。问题其实出在你设置C标准的参数上,不同编译器启用C标准的语法不一样,你用了GCC/Clang的写法,而VS的MSVC编译器不买账。

你代码里写的-std=c++11是GCC和Clang的参数格式,但MSVC编译器识别的是/std:c++11(或者更高版本的/std:c++14、/std:c++17,VS2017都支持这些)。当CMake用MSVC去编译那段检查代码时,-std=c++11会被当成无效参数直接忽略,导致检查代码可能以旧的C++标准编译,自然就识别不了std::shared_ptr了。

给你两个解决思路:

思路一:针对编译器类型设置对应参数

修改你的CMake代码,根据编译器类型选择正确的标准启用参数:

# 区分编译器,设置正确的C++标准启用参数
if(MSVC)
    set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} /std:c++11")
else()
    set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++11")
endif()

INCLUDE(CheckCXXSourceCompiles)
CHECK_CXX_SOURCE_COMPILES(
    "#include <memory>
    void test(std::shared_ptr<int>) {};
    int main() { return 0; }"
    HAVE_SHARED_PTR
)

# message("HAVE_SHARED_PTR: ${HAVE_SHARED_PTR}")
ADD_CONFIG(HAVE_SHARED_PTR)

if (NOT HAVE_SHARED_PTR)
    message(FATAL_ERROR "Type std::shared_ptr required by CDK is not available")
endif()

思路二:用CMake通用变量设置C++标准

更推荐的方式是使用CMake提供的CMAKE_CXX_STANDARD变量,它会自动适配不同编译器的参数格式,同时还能保证整个项目都遵循指定的C++标准。你可以在项目的CMakeLists开头加上:

# 设置C++11标准,要求必须支持,禁用编译器扩展
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

这样之后,你甚至可以去掉手动设置CMAKE_REQUIRED_FLAGS的代码,CMake会自动处理标准启用的问题,检查std::shared_ptr的逻辑也能正常工作。

内容的提问来源于stack exchange,提问作者user358186

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:27:40