CMake编译MySQL Connector-C++时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
相关产品推荐
相关产品推荐

