cmake:msvc分别对不同的target使用不同的运行库选项(/MT或/MD)

原创 2018年04月17日 13:49:58

很久以前写过一篇关于cmake下为msvc设置/MT的文章:

cmake:msvc编译第三方库时使用/MT静态库连接c/c++ runtime library

当时是为了解决用msvc编译时使用/MT连接static c library的问题。CMakeLists.txt中添加如下的代码,即可以将所有默认的C,CXX编译选项中的/MD替换成/MT.

if(MSVC)     
    # Use the static C library for all build types
    foreach(var 
        CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
        CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
        CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
        CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO
      )
      if(${var} MATCHES "/MD")
        # 正则表达式替换/MD为/MT
        string(REGEX REPLACE "/MD" "/MT" ${var} "${${var}}")
      endif()
    endforeach()    
endif(MSVC)

如果你希望CMakeLists.txt中所有的target都使用c/c++静态库,那么上面的做法就完全满足需要。
但如果希望针对CMakeLists.txt中的不同target使用不同的/MT/MD选项,这个办法就不行了。如果希望针对特定的target设置/MT选项,该怎么办呢?

这里就用到了target_compile_options命令还用到了Generator expressions,以下为封装成function的实现代码

# Use the static C library for all build types to a target
# MSVC编译时对指定的target设置'/MT'选项连接static c/c++ library
function (with_mt_if_msvc target )
if(MSVC) 
  # Generator expressions
  set(_mt "/MT$<$<CONFIG:Debug>:d")
  get_target_property(_options ${target} COMPILE_OPTIONS)
  if(_options)
    # message(STATUS "${target} COMPILE_OPTIONS=${_options}")
    if(${_options} MATCHES "/MD")
      string(REGEX REPLACE "/MD" "/MT" _options "${_options}")
    else()
      set(_options "${_options} ${_mt}")
    endif()    
  else()
    set(_options "${_mt}")
  endif() 
  target_compile_options( ${target} PUBLIC "${_options}")
  # Cleanup temporary variables.
  unset(_mt)
  unset(_options)
  message(STATUS "target ${target} use static runtime /MT")
endif(MSVC)
endfunction()

有了这个with_mt_if_msvc函数,你可以针对target设置/MT选项,而那些没有指定的target仍使用默认的/MD选项

参考资料

Is it possible, in the same CMakeLists.txt, to setup projects with /MT and others with /MD?
target_compile_options
cmake-generator-expressions

版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/79973750

cmake设置msvc的运行库(runtime library)塈指定openjpeg使用静态库

cmake这个跨平台的make工具功能已经很强大了,但它也有不足的地方,就是本文的标题。 在用cmake生成NMake的Makefile或visual studio的.sln时,如何指定运行库(/M...
  • 10km
  • 10km
  • 2016-06-22 17:04:11
  • 2255

cmake:msvc编译第三方库时使用/MT静态库连接c/c++ runtime library

关于在cmake生成msvc工程时静态链接c/c++运行库的问题,很久以前写过一篇博客《cmake设置msvc的运行库(runtime library)塈指定openjpeg使用静态库》。当时的办法是...
  • 10km
  • 10km
  • 2017-06-27 00:10:50
  • 1319

VS项目属性中C/C++运行库 、MT /MTd /MD /MDd

from :http://blog.csdn.net/ithzhang/article/details/20160009 周五晚,小雨,少见的未加班。无聊,遂准备写一篇博客,介绍一下C和C+...
  • u010059658
  • u010059658
  • 2016-03-31 15:03:10
  • 2458

[Windows]_[初级]_[/MD、/MT、/LD(使用运行库)]

原文链接: http://msdn.microsoft.com/zh-cn/library/2kzt1wy3.aspx 指示多线程模块是否为 DLL,并指定运行库的零售版本或调试版本。 ...
  • infoworld
  • infoworld
  • 2014-12-03 09:42:56
  • 1132

多线程MT和多线程MD的区别

遇到问题:在编写DLL的过程中,一个接口在执行return之后,出现崩溃,崩溃出现在HeapFree这里。 解决办法:更改工程属性,C/C++——代码生成——运行库,由多线程(/MT)修改为...
  • huashuolin001
  • huashuolin001
  • 2016-06-22 12:30:02
  • 1939

vc++编译时运行库选择(/MT、/MTd、/MD、/MDd)

在vs中,项目属性 -》C/C++ -》代码生成 -》运行库 选项内有四个选项:多线程(/MT)、多线程调试(/MTd)、多线程DLL(/MD)、多线程调试DLL(/MDd)。这个设置代表什么意思?四...
  • lwwl12
  • lwwl12
  • 2017-08-10 11:58:23
  • 436

cmake 设置vs工程的MT、MTd

cmake设置vs工程的多线程链接库MT、MTd
  • frank_liuxing
  • frank_liuxing
  • 2017-06-30 17:26:28
  • 1503

VC使用动态库关于/MD与/MT的一个坑

项目中使用一个动态库,导出了一个方法void Test(string tt); 这个方法包含一个string类型的参数。 在测试项目1中使用该动态库的Test导出方法,无论如何都会在释放参数tt的时候...
  • pc0de
  • pc0de
  • 2016-07-28 20:21:39
  • 2206

VS项目属性中的C/C++运行库:MT、MTd、MD、MDd

文章转载自:http://blog.csdn.net/ithzhang/article/details/20160009      在各个版本的编译器中,我们可以通过配置选项来设置程序使用的C和C...
  • u011499425
  • u011499425
  • 2016-09-08 22:24:20
  • 2141

关于Visual Studio中C++选项/MT和/MD的配置

配置VisualStudio的C++的编译选项时,在Project的Configuration Properties->C/C++/->CodeGeneration中,有关于RuntimeLibrar...
  • socrates
  • socrates
  • 2009-01-04 16:11:00
  • 3804
收藏助手
不良信息举报
您举报文章:cmake:msvc分别对不同的target使用不同的运行库选项(/MT或/MD)
举报原因:
原因补充:

(最多只允许输入30个字)