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

42 篇文章 28 订阅
20 篇文章 7 订阅

cmake这个跨平台的make工具功能已经很强大了,但它也有不足的地方,就是本文的标题。
在用cmake生成NMake的Makefile或visual studio的.sln时,如何指定运行库(/MD /MT)?
原本,我以为可以在CMAKE的手册中找到一个command或PROPERTY或VARIABLE,简单的调用或设置一下就可以了,很遗憾,把整个CMAKE manual翻了几遍也没找到,没捷径,只能写代码实现。
其实在翻手册之前我已经有了答案,就是照抄开源项目[libjpeg_turbo]1的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

jpeg 编解码系列文章

《mingw(gcc)编译libjpeg-turbo》
《libjpeg:实现jpeg内存压缩暨error_exit错误异常处理和个性化参数设置》
《libjpeg:实现jpeg内存解压缩塈转换色彩空间/压缩分辨率》
《libjpeg:读取jpeg头获取图像基本信息(jpeg_read_header)》
《nmake(vs2015)命令行编译libjpeg-turbo(x86/amd64)》

jpeg2000 编码系列文章

《mingw(gcc)编译openjpeg》
《VS2015编译openjpeg(32/64位)》
《openjpeg:解决静态链接时未定义引用错误:undefined reference to `__imp_opj_xxxxxxx‘》
《jpeg2000(j2k)图像编码解码:c++实现openjpeg内存流接口(memory stream)》
《openjpeg:jpeg2000(j2k)图像内存压缩编码》
《openjpeg:jpeg2000(j2k)图像内存解压缩(解码)》
《cmake设置msvc的运行库(runtime library)塈指定openjpeg使用静态库》


  1. http://libjpeg-turbo.virtualgl.org/ ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值