cmake解决visual studio 运行时库链接错误


错误信息Error LNK2038 mismatch detected for ‘RuntimeLibrary’: value‘MT_StaticRelease’ doesn’t match value ‘MD_DynamicRelease’ infile.objvs中,链接其他库时会遇到这种错误,这是运行时库的版本没有和已有项目对齐。RuntimeLibrary是什么CRT:C Runtime Library ,C语言运行时库,系统自动为程序加载该库,以便访问C标准函数。同样,C++也有类似的东西。该库有动态和静态两个版本,现在windows推荐使用动态库。之前还分单线程和线程两种,现在只推荐多线程库。同时,根据是否能调试,总共分为四种库:多线程静态库,多线程动态库,多线程静态库debug版,多线程动态库debug。在vs中通过编译选项控制。作用:提供C标准库(如memcpy、printf、malloc等)、C++标准库(STL)支持。应用程序添加启动函数,启动函数的主要功能为将要进行的程序初始化,对全局变量进行赋初值,加载用户程序的入口函数。sln中设置runtimelibrary项目-> properties -> c/c++ -> code generation -> 改为Multi-threaded(/MT)“我这边的主项目没法修改,默认是/MT。只能把第三方的库编译时选则静态多线程 运行时库。这样就能接入主项目。”cmake中设置runtimelibrarycmake中提供了一个变量CMAKE_MSVC_RUNTIME_LIBRARY可以设置该值。该值有四种值可选MultiThreaded ,-MT选项MultiThreadedDLL,-MD选项MultiThreadedDebug ,-MTd选项MultiThreadedDebugDLL,-MDd选项如果设置不正确,会报错(即使是在其他平台下)。 设置方法如下:1set(CMAKE_MSVC_RUNTIME_LIBRARY"MultiThreaded$<$<CONFIG:Debug>:Debug>")( 图不放了,很好找这样在debug/release里使用不同的配置,,在我的问题中,写死1set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded")note!!!!!!!!上边的都可以不看,这个必须注意“Note: This variable has effect only when policy CMP0091 is set to NEWprior to the first project() or enable_language() command that enables alanguage using a compiler targeting the MSVC ABI.”该值必须在第一个project()enable_language()之前 设置规则1CMP0091也就是说,想要设置该规则,必须在顶级项目(子项目中不行,为了统一所有项目的该值)之前启用该规则。1cmake_mininum_required(VERSION 3.15.0)2if(POLICY CMP0091) # 检测是否可用,也就是cmake的版本是否大于等于3.153 cmake_policy(SET CMP0091 NEW)4endif()5project(balabala)67if (CMAKE_SYSTEM_NAME matches "Windows")8 set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded")9endif()