专栏首页10km的专栏cmake设置msvc的运行库(runtime library)塈指定openjpeg使用静态库

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

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

cmake这个跨平台的make工具功能已经很强大了,但它也有不足的地方,就是本文的标题。 在用cmake生成NMake的Makefile或visual studio的.sln时,如何指定运行库(/MD /MT)? 原本,我以为可以在CMAKE的手册中找到一个command或PROPERTY或VARIABLE,简单的调用或设置一下就可以了,很遗憾,把整个CMAKE manual翻了几遍也没找到,没捷径,只能写代码实现。 其实在翻手册之前我已经有了答案,就是照抄开源项目libjpeg_turbo的CMakeLists.txt中的代码,我只是不甘心,想找到更好的办法而已。 下面是libjpeg_turbo的CMakeLists.txt中的代码片段,这段代码对于MSVC工程强制所有target的所有build类型(DEBUG/RELEASE/MINSIZEREL/RELWITHDEBINFO)使用C静态库。 代码中文注释是博主加的。

#判断编译器类型
if(MSVC)
#添加一个名为WITH_CRT_DLL的开关选项,
#这样就可以在cmake-gui中或在命令行随时修改该开关选项。
  option(WITH_CRT_DLL
    "Link all libjpeg-turbo libraries and executables with the C run-time DLL (msvcr*.dll) instead of the static C run-time library (libcmt*.lib.)  The default is to use the C run-time DLL only with the libraries and executables that need it."
    FALSE)
  if(NOT WITH_CRT_DLL)
  # for循环修改所有CMAKE_<LANG>_FLAGS开关的编译选项变量,用正则表达式将/MD替换成/MT
    # 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)
      if(${var} MATCHES "/MD")
        #正则表达式替换
        string(REGEX REPLACE "/MD" "/MT" ${var} "${${var}}")
      endif()
    endforeach()
  endif()
  add_definitions(-W3 -wd4996)
endif()

我将这段代码原样照抄,到openjpeg的CMakeLists.txt中就实现将我要的功能。

因为我的项目代码是C++写的,所以在自己的CMakeLists.txt要使用这段代码,还要加上对C++编译选项的修改

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")
        string(REGEX REPLACE "/MD" "/MT" ${var} "${${var}}")
      endif()
    endforeach()    
endif(MSVC)

后来在网上找到两个贴子,提到的解决办法也都是差不多是这样的。看来真的是没有捷径了。 http://cmake.cmake.narkive.com/MhC0rVdG/selecting-runtime-library-on-visual-studio-projects http://stackoverflow.askbro.ru/questions/16212682/why-does-this-cmake-project-not-set-the-appropriate-msvc-runtime

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

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

    关于在cmake生成msvc工程时静态链接c/c++运行库的问题,很久以前写过一篇博客《cmake设置msvc的运行库(runtime library)塈指定o...

    用户1148648
  • CentOS6.5下python版本的protobuf编译及安装

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

    用户1148648
  • java (多网卡环境下)发送组播广播(multicast/broadcast)失败问题

    java发送组播或广播包并不复杂网上有很多文章,比如下面的两篇: 《Java实现组播(multicast)简单例子》 《Java 网络编程案例:使用 Mul...

    用户1148648
  • [译] 建立一个像科幻小说一样的虚拟世界:设计一个全球性的虚拟世界

    Android 开发者
  • 手搓一个分布式大气监测系统(五)基于物联网开发平台的云架构延伸

    先做个前情回顾:在这个系列的前面几篇文章中,(一)系统功能与架构概述、(二)架构介绍及案例解析 先总体介绍了大气监测系统的总体架构,接着 (三)使用 Nucle...

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

    关于在cmake生成msvc工程时静态链接c/c++运行库的问题,很久以前写过一篇博客《cmake设置msvc的运行库(runtime library)塈指定o...

    用户1148648
  • 技术解析:如何用pyecharts绘制时间轮播图

    我们依旧以python小小白的角度去解析如何用pyecharts去制作时间线轮播多图。其实在之前我也并没有使用过这个功能,仅有一点的类似经验是之前项目在Echa...

    刘早起
  • qt国际化

    Translate_CN.ts 汉语­>汉语(一般不用改,我们使用的是汉语,只需要改汉译英的)

    DeROy
  • python数据结构之选择排序

    选择排序(select_sort)是一个基础排序,它主要通过查找已给序列中的元素的最大或者最小元素,然后将其放在序列的起始位置或者结束位置,并通过多次这样的循环...

    py3study
  • HZ-GB-2312中文编码详解

    在上世纪八十年代的时候,发送Email只允许使用7bits(即每个字节的8bits,最高位固定为0,只使用后面7bits)。早期的一些电脑操作系统也是基于ASC...

    horstxu

扫码关注云+社区

领取腾讯云代金券