Skip to content

windows MT和MD运行时库冲突问题 #28

Description

@bingtaoli

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()

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions