cmake:解决MSVC下/MT 编译paho.mqtt.c的问题
Posted 10km
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cmake:解决MSVC下/MT 编译paho.mqtt.c的问题相关的知识,希望对你有一定的参考价值。
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
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
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代码找到如下片段:
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
以上是关于cmake:解决MSVC下/MT 编译paho.mqtt.c的问题的主要内容,如果未能解决你的问题,请参考以下文章
cmake:让mingw(gcc)生成MSVC可用的dll(.lib)----mark亲测有效