windows运行时库有MT和MD两种,我们的项目中默认静态是编译成MT,动态库编译成MD。
我有个库专门做jsonschema的校验,编译成静态的也就是MT版本的so,lib_schema。
然后我们的core库引入我的库,core库是编译成动态MD库的。
特性库防火墙firewall是个c++项目,引入了core库,也使用了我的库中的函数,编译的时候报错了,提示运行时库冲突,同时引入MT和MD,导致有函数重复定义了。
core库的cmake部分如下:
set(_TARGET_NAME libeaio_core)
set(_hidden_symbol YES)
#生成库的类型,SHARED 为动态库,STATIC为静态库,APP为可执行文件
set(_TYPE SHARED)
#安装目录
set(_INSTALL_DIR eaio_sys/bin)
set(_LIB_DEPENDS libsfe_jansson libsfe_ejs libsfe_cl_ev libeaioschema_static libeaiobase libeaioalgo librsa_static)
我的库是libeaioschema_static。
为了解决冲突,我的库需要编译一份MD版本的静态库:
#该模块的名字
set(_TARGET_NAME libeaioschema)
#生成库的类型,SHARED 为动态库,STATIC为静态库,APP为可执行文件
set(_TYPE LIB)
#是否添加md的生成方式
set(_CRT_TYPE_MD 1)
其中_CRT_TYPE_MD的实现原理:
if (DEFINED _CRT_TYPE_MD)
set(_TARGET_NAME ${_TARGET_NAME}_md)
if (("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") )
set(_EXTRA_CFLAGS_WIN ${_EXTRA_CFLAGS_WIN_TMP} /MDd)
else()
set(_EXTRA_CFLAGS_WIN ${_EXTRA_CFLAGS_WIN_TMP} /MD)
endif()
compile(${platform})
endif()
windows运行时库有MT和MD两种,我们的项目中默认静态是编译成MT,动态库编译成MD。
我有个库专门做jsonschema的校验,编译成静态的也就是MT版本的so,lib_schema。
然后我们的core库引入我的库,core库是编译成动态MD库的。
特性库防火墙firewall是个c++项目,引入了core库,也使用了我的库中的函数,编译的时候报错了,提示运行时库冲突,同时引入MT和MD,导致有函数重复定义了。
core库的cmake部分如下:
我的库是
libeaioschema_static。为了解决冲突,我的库需要编译一份MD版本的静态库:
其中
_CRT_TYPE_MD的实现原理: