前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >cmake:解决MSVC下/MT 编译paho.mqtt.c的问题

cmake:解决MSVC下/MT 编译paho.mqtt.c的问题

作者头像
10km
发布2022-04-13 11:04:28
7250
发布2022-04-13 11:04:28
举报
文章被收录于专栏:10km的专栏

paho.mqtt.c是eclipse开发的C语言跨平台mqtt client 开源库,之前写过一篇博客《cmake:VS2015和GCC编译paho.mqtt C/C++ client》介绍如何编译它。

最近在使用的时候发现有个问题:paho.mqtt.c在MSVC编译的时候不能支持/MT编译。

compiler_flag_overrides.cmake

为了以/MT编译paho.mqtt.c,在不修改paho.mqtt.c项目代码的情况需要使用CMAKE_USER_MAKE_RULES_OVERRIDE变量指定cmake脚本文件用于覆盖编译默认的编译选项定义

compiler_flag_overrides.cmake

代码语言:javascript
复制
if(MSVC)     
   option(WITH_STATIC_CRT
    "Link all libraries and executables with the static C run-time library (libcmt*.lib)instead of the C run-time DLL (msvcr*.dll)"
    FALSE)
  if(WITH_STATIC_CRT)
	  # Use the static C library for all build types
	  message(STATUS "Link to static C and C++ runtime lirbary(/MT /MTd)")

	  foreach(var 
			CMAKE_C_FLAGS_DEBUG_INIT 
			CMAKE_C_FLAGS_RELEASE_INIT
			CMAKE_C_FLAGS_MINSIZEREL_INIT 
			CMAKE_C_FLAGS_RELWITHDEBINFO_INIT
			CMAKE_CXX_FLAGS_DEBUG_INIT 
			CMAKE_CXX_FLAGS_RELEASE_INIT
			CMAKE_CXX_FLAGS_MINSIZEREL_INIT 
			CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT
	    )
	    set( has_replaced off)
	    if(${var} MATCHES "/MD")
	      string(REGEX REPLACE "/MD" "/MT" ${var} "${${var}}")
	      set( has_replaced on)
	    endif()
	    if( has_replaced ) 
	    	MESSAGE(STATUS  "${var}:${${var}}")
			endif( has_replaced )
			unset( has_replaced )
	  endforeach()
  endif(WITH_STATIC_CRT)
  # for detail,see https://msdn.microsoft.com/zh-cn/library/958x11bc.aspx
  option(WITH_DEBUG_Z7 
  	"use /Z7 option to produces an .obj file containing full symbolic debugging information for use with the debugger" 
  	FALSE)
  if(WITH_DEBUG_Z7)
	  string(REGEX REPLACE "/Z[iI]" "/Z7" CMAKE_C_FLAGS_DEBUG_INIT "${CMAKE_C_FLAGS_DEBUG_INIT}")
	  string(REGEX REPLACE "/Z[iI]" "/Z7" CMAKE_CXX_FLAGS_DEBUG_INIT "${CMAKE_CXX_FLAGS_DEBUG_INIT}")
	  MESSAGE(STATUS "CMAKE_C_FLAGS_DEBUG_INIT=${CMAKE_C_FLAGS_DEBUG_INIT}")
	  MESSAGE(STATUS "CMAKE_CXX_FLAGS_DEBUG_INIT=${CMAKE_CXX_FLAGS_DEBUG_INIT}")
	endif()
endif(MSVC)

cmake

有了compiler_flag_overrides.cmake就可以如下在cmake执行时用CMAKE_USER_MAKE_RULES_OVERRIDE定义它的位置,同时要指定WITH_STATIC_CRT=ON

代码语言:javascript
复制
ECHO creating x86_64 Project for Visual Studio 2015 ...
CMAKE . -G "Visual Studio 14 2015 Win64"  ^
	-DCMAKE_USER_MAKE_RULES_OVERRIDE=%sh_folder%\cmake\compiler_flag_overrides.cmake ^
	-DWITH_STATIC_CRT=ON ^
    -DCMAKE_DEBUG_POSTFIX=_d ^
 	-DPAHO_WITH_SSL=FALSE

执行是成功的生成了工程文件

然而发现生成的MSVC工程文件还是以/MD选项编译。

compiler_flag_overrides.cmake这个文件的用法肯定没错,已经在我的其他项目多次使用过,问题应该出在paho.mqtt.c的CMakeLists.txt。

查看paho.mqtt.c的CMakeLists.txt代码找到如下片段:

代码语言:javascript
复制
IF(WIN32)
  ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE -DWIN32_LEAN_AND_MEAN -MD)
ELSEIF(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
  ADD_DEFINITIONS(-DOSX)
ENDIF()

-MD是什么鬼?应该就是它强制将项目的代码生成方式设置成了/MD,删除它,再试果然正常了。

Pull Request

上面修改已经向paho.mqtt.c提交了PR

https://github.com/eclipse/paho.mqtt.c/pull/1189

如果PR被批准,你就可以使用修复后的代码,否则要自己修改脚本。

paho.mqtt.build

关于paho.mqtt.c的完整编译脚本参见

https://gitee.com/l0km/paho.mqtt.build.git

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/01/06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • compiler_flag_overrides.cmake
  • cmake
  • Pull Request
  • paho.mqtt.build
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档