CMAKE_MSVC_RUNTIME_LIBRARY 设置无效解决方法

文章讲述了在使用CMake3.15及以上版本时遇到CMAKE_MSVC_RUNTIME_LIBRARY设置不生效的困扰,经过搜索和比对,发现在project命令之前设置该选项才能正确影响编译过程。作者提供了修改后的CMakeLists.txt文件片段,展示了如何正确设置静态或动态运行库。
摘要由CSDN通过智能技术生成

CMake 3.15及以后版本增加了CMAKE_MSVC_RUNTIME_LIBRARY的选项,用于设置MSVC运行库,但是试了N边都是不起作用,Google了一堆也就发现几篇文章讲这个问题的,关键他们居然都成功了!实在想不通,把CMakeLists.txt文件翻来覆去的看也没发现问题,最后终于搜到一个相关链接:

http://www.open3d.org/docs/latest/_downloads/fec171dc63cc69d958f5cc1bb06b6c9c/CMakeLists.txt

这个CMakeLists.txt文件中也设置了CMAKE_MSVC_RUNTIME_LIBRARY选项,对比了发现了问题,他的CMAKE_MSVC_RUNTIME_LIBRARY的选项是在project之前设置的!难道。。。我赶紧修改下我的CMakeLists.txt文件,一试果然成功了!下面贴下我的CMakeLists.txt文件中相关设置:

option(MSVC_STATIC_RUNTIME "Build static runtime" OFF)

# The CMAKE_<LANG>_FLAGS(_<BUILD_TYPE>)? is meant to be user controlled.
# Prior to CMake 3.15, the MSVC runtime library was pushed into the same flags
# making programmatic control difficult.  Prefer the functionality in newer
# CMake versions when available.
if(${CMAKE_VERSION} VERSION_GREATER 3.15 OR ${CMAKE_VERSION} VERSION_EQUAL 3.15)  
	if (MSVC_STATIC_RUNTIME)
		set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
	else()
		set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
	endif()
	
	message(STATUS "CMAKE_MSVC_RUNTIME_LIBRARY=${CMAKE_MSVC_RUNTIME_LIBRARY}")
else()
	# In case we are building static libraries, link also the runtime library statically
	# so that MSVCR*.DLL is not required at runtime.
	# https://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx
	# This is achieved by replacing msvc option /MD with /MT and /MDd with /MTd
	# http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_build_my_MSVC_application_with_a_static_runtime.3F
	if (MSVC AND MSVC_STATIC_RUNTIME)
		message(STATUS "MSVC_STATIC_RUNTIME on")
		set(CompilerFlags
        CMAKE_CXX_FLAGS
        CMAKE_CXX_FLAGS_DEBUG
        CMAKE_CXX_FLAGS_RELEASE
		CMAKE_CXX_FLAGS_MINSIZEREL
		CMAKE_CXX_FLAGS_RELWITHDEBINFO
        CMAKE_C_FLAGS
        CMAKE_C_FLAGS_DEBUG
        CMAKE_C_FLAGS_RELEASE
		CMAKE_CXX_FLAGS_MINSIZEREL
		CMAKE_C_FLAGS_RELWITHDEBINFO
        )
		foreach(flag_var
			CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
			CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
			if(${flag_var} MATCHES "/MD")
				string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
			endif(${flag_var} MATCHES "/MD")
		endforeach(flag_var)
	endif()
endif()

if(MSVC)
	add_definitions(-DUNICODE -D_UNICODE)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4251")
endif()

set(PROJECT_NAME "WinPipe")

project(${PROJECT_NAME} CXX)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值